This commit is contained in:
aozhiwei 2019-04-11 16:14:17 +08:00
parent 2d46bd1b64
commit 15a137c3b9
7 changed files with 186 additions and 40 deletions

View File

@ -56,7 +56,7 @@ void Bullet::Update(int delta_time)
if (!objects.empty()) { if (!objects.empty()) {
OnHit(objects); OnHit(objects);
} }
room->AddDeletedObject(entity_uniid); room->AddDeletedObject(entity_uniid, true);
} }
} }
} }
@ -166,5 +166,5 @@ void Bullet::ProcBomb()
} }
break; break;
} }
room->AddDeletedObject(entity_uniid); room->AddDeletedObject(entity_uniid, true);
} }

View File

@ -4,12 +4,13 @@
struct RoomFrameData struct RoomFrameData
{ {
std::set<unsigned short> deleted_objects; std::map<long long, std::set<unsigned short>> deleted_objects_hash;
std::map<long long, std::set<unsigned short>> softdeleted_objects_hash;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>> explosions_hash; std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFExplosion>> explosions_hash;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>> smokes_hash; std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>> smokes_hash;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFEmote>> emotes_hash; std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFEmote>> emotes_hash;
::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFBullet>> bullets_hash;
::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFShot>> shots_hash;
}; };
struct HumanFrameData struct HumanFrameData

View File

@ -118,14 +118,37 @@ void Human::Shot(Vector2D& target_dir)
return; return;
} }
{ {
cs::MFShot* shot = room->frame_data.shots.Add(); ::google::protobuf::RepeatedPtrField<::cs::MFShot>* shots = nullptr;
{
{
auto itr = room->frame_data.shots_hash.find(room->frame_no);
if (itr == room->frame_data.shots_hash.end()) {
room->frame_data.shots_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFShot>();
itr = room->frame_data.shots_hash.find(room->frame_no);
}
shots = &itr->second;
}
}
cs::MFShot* shot = shots->Add();
shot->set_player_id(entity_uniid); shot->set_player_id(entity_uniid);
curr_weapon->ToPB(shot->mutable_weapon()); curr_weapon->ToPB(shot->mutable_weapon());
shot->set_offhand(true); shot->set_offhand(true);
shot->set_bullskin(10001); shot->set_bullskin(10001);
} }
::google::protobuf::RepeatedPtrField<::cs::MFBullet>* bullets = nullptr;
{ {
cs::MFBullet* bullet = room->frame_data.bullets.Add(); {
auto itr = room->frame_data.bullets_hash.find(room->frame_no);
if (itr == room->frame_data.bullets_hash.end()) {
room->frame_data.bullets_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFBullet>();
itr = room->frame_data.bullets_hash.find(room->frame_no);
}
bullets = &itr->second;
}
}
{
cs::MFBullet* bullet = bullets->Add();
bullet->set_player_id(entity_uniid); bullet->set_player_id(entity_uniid);
bullet->set_bullet_id(curr_weapon->meta->i->use_bullet()); bullet->set_bullet_id(curr_weapon->meta->i->use_bullet());
pos.ToPB(bullet->mutable_pos()); pos.ToPB(bullet->mutable_pos());

View File

@ -307,7 +307,19 @@ void Player::Shot()
} }
{ {
cs::MFShot* shot = room->frame_data.shots.Add(); ::google::protobuf::RepeatedPtrField<::cs::MFShot>* shots = nullptr;
{
{
auto itr = room->frame_data.shots_hash.find(room->frame_no);
if (itr == room->frame_data.shots_hash.end()) {
room->frame_data.shots_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFShot>();
itr = room->frame_data.shots_hash.find(room->frame_no);
}
shots = &itr->second;
}
}
cs::MFShot* shot = shots->Add();
shot->set_player_id(entity_uniid); shot->set_player_id(entity_uniid);
curr_weapon->ToPB(shot->mutable_weapon()); curr_weapon->ToPB(shot->mutable_weapon());
shot->set_offhand(true); shot->set_offhand(true);
@ -317,8 +329,19 @@ void Player::Shot()
Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple));
bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP)); bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP));
Vector2D bullet_born_pos = pos + bullet_born_offset; Vector2D bullet_born_pos = pos + bullet_born_offset;
::google::protobuf::RepeatedPtrField<::cs::MFBullet>* bullets = nullptr;
{ {
cs::MFBullet* bullet = room->frame_data.bullets.Add(); {
auto itr = room->frame_data.bullets_hash.find(room->frame_no);
if (itr == room->frame_data.bullets_hash.end()) {
room->frame_data.bullets_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFBullet>();
itr = room->frame_data.bullets_hash.find(room->frame_no);
}
bullets = &itr->second;
}
}
{
cs::MFBullet* bullet = bullets->Add();
bullet->set_player_id(entity_uniid); bullet->set_player_id(entity_uniid);
bullet->set_bullet_id(curr_weapon->meta->i->use_bullet()); bullet->set_bullet_id(curr_weapon->meta->i->use_bullet());
bullet_born_pos.ToPB(bullet->mutable_pos()); bullet_born_pos.ToPB(bullet->mutable_pos());
@ -560,7 +583,7 @@ void Player::LootInteraction(Loot* entity)
break; break;
} }
entity->pickuped = true; entity->pickuped = true;
room->AddDeletedObject(entity->entity_uniid); room->AddDeletedObject(entity->entity_uniid, false);
} }
void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
@ -799,12 +822,28 @@ void Player::MakeUpdateMsg()
update_msg->Clear(); update_msg->Clear();
{ {
update_msg->set_ack(last_seq_id); update_msg->set_ack(last_seq_id);
for (auto& obj_uniid : room->frame_data.deleted_objects) {
update_msg->add_del_objids(obj_uniid);
}
*update_msg->mutable_shots() = room->frame_data.shots;
*update_msg->mutable_bullets() = room->frame_data.bullets;
{ {
for (auto& pair : room->frame_data.deleted_objects_hash) {
if (pair.first <= room->frame_no) {
for (auto& itr : pair.second) {
update_msg->add_del_objids(itr);
}
}
}
for (auto& pair : room->frame_data.shots_hash) {
if (pair.first <= room->frame_no) {
for (auto& itr : pair.second) {
*update_msg->add_shots() = itr;
}
}
}
for (auto& pair : room->frame_data.bullets_hash) {
if (pair.first <= room->frame_no) {
for (auto& itr : pair.second) {
*update_msg->add_bullets() = itr;
}
}
}
for (auto& pair : room->frame_data.explosions_hash) { for (auto& pair : room->frame_data.explosions_hash) {
if (pair.first <= room->frame_no) { if (pair.first <= room->frame_no) {
for (auto& itr : pair.second) { for (auto& itr : pair.second) {

View File

@ -27,6 +27,7 @@ const int ANDROID_NUM = 10;
void Room::Initialize() void Room::Initialize()
{ {
ShuaAndroid(); ShuaAndroid();
CreateThings();
#if 0 #if 0
a8::Timer::Instance()->AddRepeatTimer( a8::Timer::Instance()->AddRepeatTimer(
1000 * 5, 1000 * 5,
@ -63,6 +64,50 @@ void Room::Update(int delta_time)
ClearDeletedObjects(); ClearDeletedObjects();
ProcAddedObjects(); ProcAddedObjects();
{ {
{
std::vector<long long> del_ids;
for (auto& pair : frame_data.deleted_objects_hash) {
if (pair.first < frame_no) {
del_ids.push_back(pair.first);
}
}
for (long long id : del_ids) {
frame_data.deleted_objects_hash.erase(id);
}
}
{
std::vector<long long> del_ids;
for (auto& pair : frame_data.softdeleted_objects_hash) {
if (pair.first < frame_no) {
del_ids.push_back(pair.first);
}
}
for (long long id : del_ids) {
frame_data.softdeleted_objects_hash.erase(id);
}
}
{
std::vector<long long> del_ids;
for (auto& pair : frame_data.bullets_hash) {
if (pair.first < frame_no) {
del_ids.push_back(pair.first);
}
}
for (long long id : del_ids) {
frame_data.bullets_hash.erase(id);
}
}
{
std::vector<long long> del_ids;
for (auto& pair : frame_data.shots_hash) {
if (pair.first < frame_no) {
del_ids.push_back(pair.first);
}
}
for (long long id : del_ids) {
frame_data.shots_hash.erase(id);
}
}
{ {
std::vector<long long> del_ids; std::vector<long long> del_ids;
for (auto& pair : frame_data.explosions_hash) { for (auto& pair : frame_data.explosions_hash) {
@ -164,6 +209,21 @@ void Room::AddPlayer(Player* hum)
hum->part_objects.insert(pair.second); hum->part_objects.insert(pair.second);
} }
} }
for (auto& pair : uniid_hash_) {
switch (pair.second->entity_type) {
case ET_Building:
case ET_Obstacle:
{
hum->new_objects.insert(pair.second);
hum->part_objects.insert(pair.second);
}
break;
default:
{
}
break;
}
}
} }
unsigned short Room::AllocUniid() unsigned short Room::AllocUniid()
@ -265,9 +325,25 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vector<E
} }
} }
void Room::AddDeletedObject(unsigned short obj_uniid) void Room::AddDeletedObject(unsigned short obj_uniid, bool soft_delete)
{ {
frame_data.deleted_objects.insert(obj_uniid); std::set<unsigned short>* deleted_objects = nullptr;
if (soft_delete) {
auto itr = frame_data.softdeleted_objects_hash.find(frame_no);
if (itr == frame_data.softdeleted_objects_hash.end()) {
frame_data.softdeleted_objects_hash[frame_no] = std::set<unsigned short>();
itr = frame_data.softdeleted_objects_hash.find(frame_no);
}
deleted_objects = &itr->second;
} else {
auto itr = frame_data.deleted_objects_hash.find(frame_no);
if (itr == frame_data.deleted_objects_hash.end()) {
frame_data.deleted_objects_hash[frame_no] = std::set<unsigned short>();
itr = frame_data.deleted_objects_hash.find(frame_no);
}
deleted_objects = &itr->second;
}
deleted_objects->insert(obj_uniid);
} }
void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg) void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg)
@ -288,9 +364,6 @@ void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg)
void Room::ResetFrameData() void Room::ResetFrameData()
{ {
frame_data.deleted_objects.clear();
frame_data.bullets.Clear();
frame_data.shots.Clear();
} }
void Room::ScatterDrop(Vector2D center, int drop_id) void Room::ScatterDrop(Vector2D center, int drop_id)
@ -328,10 +401,6 @@ void Room::CreateThings()
entity->pos = Vector2D(thing_tpl.i->x(), thing_tpl.i->y()); entity->pos = Vector2D(thing_tpl.i->x(), thing_tpl.i->y());
entity->Initialize(); entity->Initialize();
uniid_hash_[entity->entity_uniid] = entity; uniid_hash_[entity->entity_uniid] = entity;
for (auto& pair : human_hash_) {
pair.second->new_objects.insert(entity);
pair.second->part_objects.insert(entity);
}
} }
} else { } else {
Obstacle* entity = new Obstacle(); Obstacle* entity = new Obstacle();
@ -341,10 +410,6 @@ void Room::CreateThings()
entity->pos = Vector2D(thing_tpl.i->x(), thing_tpl.i->y()); entity->pos = Vector2D(thing_tpl.i->x(), thing_tpl.i->y());
entity->Initialize(); entity->Initialize();
uniid_hash_[entity->entity_uniid] = entity; uniid_hash_[entity->entity_uniid] = entity;
for (auto& pair : human_hash_) {
pair.second->new_objects.insert(entity);
pair.second->part_objects.insert(entity);
}
} }
} }
} }
@ -510,7 +575,8 @@ void Room::OnHumanDie(Human* hum)
void Room::ClearDeletedObjects() void Room::ClearDeletedObjects()
{ {
for (auto& obj_uniid : frame_data.deleted_objects) { for (auto& pair : frame_data.deleted_objects_hash) {
for (auto& obj_uniid : pair.second) {
Entity* entity = GetEntityByUniId(obj_uniid); Entity* entity = GetEntityByUniId(obj_uniid);
if (entity) { if (entity) {
if (entity->entity_type != ET_Player) { if (entity->entity_type != ET_Player) {
@ -526,6 +592,24 @@ void Room::ClearDeletedObjects()
} }
} }
for (auto& pair : frame_data.softdeleted_objects_hash) {
for (auto& obj_uniid : pair.second) {
Entity* entity = GetEntityByUniId(obj_uniid);
if (entity) {
if (entity->entity_type != ET_Player) {
uniid_hash_.erase(entity->entity_uniid);
moveable_hash_.erase(entity->entity_uniid);
}
for (auto& pair : human_hash_) {
pair.second->new_objects.erase(entity);
pair.second->part_objects.erase(entity);
}
delete entity;
}
}
}
}
void Room::TouchPlayerList(a8::XParams param, void Room::TouchPlayerList(a8::XParams param,
std::function<void (Player*, a8::XParams&)> func) std::function<void (Player*, a8::XParams&)> func)
{ {

View File

@ -37,7 +37,7 @@ public:
Human* FindEnemy(Human* hum); Human* FindEnemy(Human* hum);
void CollisionDetection(Entity* sender, int detection_flags, std::vector<Entity*>& objects); void CollisionDetection(Entity* sender, int detection_flags, std::vector<Entity*>& objects);
void AddDeletedObject(unsigned short obj_uniid); void AddDeletedObject(unsigned short obj_uniid, bool soft_delete);
void BeAddedObject(Entity* entity); void BeAddedObject(Entity* entity);
void FetchBuilding(Human* hum); void FetchBuilding(Human* hum);

View File

@ -50,7 +50,6 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg)
Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(hdr.socket_handle, msg); Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(hdr.socket_handle, msg);
hum->meta = hum_meta; hum->meta = hum_meta;
room->AddPlayer(hum); room->AddPlayer(hum);
room->CreateThings();
{ {
cs::SMJoinedNotify notifymsg; cs::SMJoinedNotify notifymsg;