炸弹逻辑ok

This commit is contained in:
aozhiwei 2019-04-03 17:13:29 +08:00
parent ce2d604f9c
commit b0c3333572
8 changed files with 141 additions and 17 deletions

View File

@ -30,20 +30,28 @@ void Bullet::Update(int delta_time)
{
movement->Update(delta_time);
pos = pos + dir * gun_meta->i->bullet_speed() / 20.0f;
std::vector<Entity*> objects;
int detection_flags = 0;
{
a8::SetBitFlag(detection_flags, ET_Obstacle);
a8::SetBitFlag(detection_flags, ET_Player);
}
room->CollisionDetection(this, detection_flags, objects);
float distance = (pos - born_pos).Norm();
if (!objects.empty() || distance > gun_meta->i->range()) {
deleted = true;
if (!objects.empty()) {
OnHit(objects);
if (meta->i->_inventory_slot() == 5 ||
meta->i->_inventory_slot() == 6) {
if (distance >= fly_distance) {
//炸弹烟雾弹飞到目的地
ProcBomb();
}
} else {
std::vector<Entity*> objects;
int detection_flags = 0;
{
a8::SetBitFlag(detection_flags, ET_Obstacle);
a8::SetBitFlag(detection_flags, ET_Player);
}
room->CollisionDetection(this, detection_flags, objects);
if (!objects.empty() || distance > gun_meta->i->range()) {
deleted = true;
if (!objects.empty()) {
OnHit(objects);
}
room->AddDeletedObject(entity_uniid);
}
room->AddDeletedObject(entity_uniid);
}
}
@ -93,3 +101,50 @@ void Bullet::OnHit(std::vector<Entity*>& objects)
}
}
}
void Bullet::ProcBomb()
{
switch (meta->i->_inventory_slot()) {
case 5:
{
//手雷
::google::protobuf::RepeatedPtrField<::cs::MFExplosion>* explosions = nullptr;
{
auto itr = room->frame_data.explosions_hash.find(room->frame_no);
if (itr == room->frame_data.explosions_hash.end()) {
room->frame_data.explosions_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>();
itr = room->frame_data.explosions_hash.find(room->frame_no);
}
explosions = &itr->second;
}
Vector2D bomb_pos = born_pos + born_dir * fly_distance;
cs::MFExplosion* explosion = explosions->Add();
explosion->set_item_id(meta->i->id());
bomb_pos.ToPB(explosion->mutable_pos());
explosion->set_player_id(player->entity_uniid);
}
break;
case 6:
{
//烟雾弹
::google::protobuf::RepeatedPtrField<::cs::MFSmoke>* smokes = nullptr;
{
auto itr = room->frame_data.smokes_hash.find(room->frame_no);
if (itr == room->frame_data.smokes_hash.end()) {
room->frame_data.smokes_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>();
itr = room->frame_data.smokes_hash.find(room->frame_no);
}
smokes = &itr->second;
}
Vector2D bomb_pos = born_pos + born_dir * fly_distance;
cs::MFSmoke* smoke = smokes->Add();
smoke->set_item_id(meta->i->id());
bomb_pos.ToPB(smoke->mutable_pos());
smoke->set_player_id(player->entity_uniid);
}
break;
}
room->AddDeletedObject(entity_uniid);
}

View File

@ -19,6 +19,7 @@ class Bullet : public Entity
Vector2D dir;
Vector2D born_pos;
Vector2D born_dir;
float fly_distance = 0.0f;
Bullet();
virtual ~Bullet() override;
@ -29,6 +30,7 @@ class Bullet : public Entity
private:
void OnHit(std::vector<Entity*>& objects);
void ProcBomb();
private:
CircleCollider* self_collider_ = nullptr;

View File

@ -176,6 +176,7 @@ void Player::Shot()
attack_dir.ToPB(bullet->mutable_dir());
bullet->set_bulletskin(10001);
bullet->set_gun_id(curr_weapon->meta->i->id());
bullet->set_fly_distance(fly_distance);
}
{
Bullet* bullet = new Bullet();
@ -187,10 +188,23 @@ void Player::Shot()
bullet->dir = attack_dir;
bullet->born_pos = pos;
bullet->born_dir = attack_dir;
bullet->fly_distance = fly_distance;
bullet->entity_uniid = bullet->room->AllocUniid();
bullet->Initialize();
room->AddBullet(bullet);
}
switch (curr_weapon->meta->i->_inventory_slot()) {
case 5:
{
//手雷
}
break;
case 6:
{
//烟雾弹
}
break;
}
}
void Player::ProcInteraction()
@ -298,6 +312,7 @@ void Player::LootInteraction(Loot* entity)
weapon->weapon_id = entity->item_id;
weapon->weapon_lv = 1;
weapon->num = 0;
weapon->meta = item_meta;
need_sync_active_player = true;
for (auto& pair : room->human_hash_) {
pair.second->new_objects.insert(this);
@ -317,6 +332,7 @@ void Player::LootInteraction(Loot* entity)
weapon->weapon_id = entity->item_id;
weapon->weapon_lv = 1;
weapon->num = 0;
weapon->meta = item_meta;
}
}
if (item_meta->i->_inventory_slot() > 12) {
@ -363,6 +379,7 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
}
shot_start = msg.shot_start();
shot_hold = msg.shot_hold();
fly_distance = std::min(200.0f, msg.fly_distance());
if (!shot_hold) {
series_shot_frames = 0;
}
@ -564,6 +581,27 @@ void Player::MakeUpdateMsg()
}
*update_msg->mutable_shots() = room->frame_data.shots;
*update_msg->mutable_bullets() = room->frame_data.bullets;
//*update_msg->mutable_explosions() = room->frame_data.explosions;
//*update_msg->mutable_smokes() = room->frame_data.smokes;
{
for (auto& pair : room->frame_data.explosions_hash) {
if (pair.first <= room->frame_no) {
for (auto& itr : pair.second) {
*update_msg->add_explosions() = itr;
}
}
}
for (auto& pair : room->frame_data.smokes_hash) {
if (pair.first <= room->frame_no) {
for (auto& itr : pair.second) {
*update_msg->add_smokes() = itr;
}
}
}
}
if (update_msg->mutable_smokes()->size() > 0) {
int i = 0;
}
for (auto& itr : new_objects) {
itr->FillMFObjectFull(update_msg->add_full_objects());
#if 0

View File

@ -38,6 +38,7 @@ class Player : public Human
bool shot_start = false;
bool shot_hold = false;
int series_shot_frames = 0;
float fly_distance = 0.0f;
bool select_weapon = false;
int selected_weapon_idx = 0;

View File

@ -32,6 +32,30 @@ void Room::Update(int delta_time)
if (frame_no % 2 == 0) {
ClearDeletedObjects();
ProcAddedObjects();
{
{
std::vector<long long> del_ids;
for (auto& pair : frame_data.explosions_hash) {
if (pair.first < frame_no) {
del_ids.push_back(pair.first);
}
}
for (long long id : del_ids) {
frame_data.explosions_hash.erase(id);
}
}
{
std::vector<long long> del_ids;
for (auto& pair : frame_data.smokes_hash) {
if (pair.first < frame_no) {
del_ids.push_back(pair.first);
}
}
for (long long id : del_ids) {
frame_data.smokes_hash.erase(id);
}
}
}
}
++frame_no;
elapsed_time_ -= 50;
@ -329,10 +353,15 @@ void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg)
void Room::ResetFrameData()
{
frame_data.deleted_objects.clear();
frame_data.explosions.Clear();
frame_data.emotes.Clear();
#if 0
{
frame_data.explosions_hash.clear();
frame_data.smokes_hash.clear();
}
#endif
frame_data.bullets.Clear();
frame_data.shots.Clear();
frame_data.emotes.Clear();
}
void Room::ProcDrop(Vector2D center, int drop_id)

View File

@ -18,7 +18,8 @@ namespace MetaData
struct RoomFrameData
{
std::set<unsigned short> deleted_objects;
::google::protobuf::RepeatedPtrField<::cs::MFExplosion> explosions;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>> explosions_hash;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>> smokes_hash;
::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes;
::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets;
::google::protobuf::RepeatedPtrField<::cs::MFShot> shots;

View File

@ -457,7 +457,6 @@ message MFSmoke
{
optional int32 item_id = 1; //id
optional MFVector2D pos = 2; //
optional float rad = 3; //
optional int32 player_id = 4; //id
}

View File

@ -61,7 +61,6 @@ message Equip
optional int32 use_time = 15; //使
optional int32 heal = 16; //
optional int32 energy = 17; //
optional int32 number = 18; //
optional int32 volume = 19; //
optional int32 bullet_rad = 20; //