From 308a64c62d455c98795b6daa3d666d1c94e1ecea Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 5 May 2019 11:45:26 +0800 Subject: [PATCH] FindLocationWithTarget ok --- server/gameserver/entity.cc | 52 +++++++++++++++++++++++++++----- server/gameserver/gridservice.cc | 46 ++++++++++++++++++++++++---- server/gameserver/gridservice.h | 17 ++++++----- server/gameserver/human.cc | 1 + server/gameserver/room.cc | 4 ++- 5 files changed, 98 insertions(+), 22 deletions(-) diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index e06c07a..e50233d 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -67,19 +67,55 @@ void Entity::FindLocationWithTarget(Entity* target) new_pos_dir.Normalize(); for (float i = distance; i < 10000000; i += 5.0f) { pos = old_pos + new_pos_dir * i; + std::set new_grid_list; + room->grid_service.GetAllCellsByXy(pos.x, pos.y, new_grid_list); + std::vector objects; - int detection_flags = 0; - { - a8::SetBitFlag(detection_flags, ET_Obstacle); + for (auto& grid : new_grid_list) { + for (Entity* entity : grid->entity_list) { + switch (entity->entity_type) { + case ET_Obstacle: + { + if (entity != this && TestCollision(entity)){ + objects.push_back(entity); + break; + } + } + break; + default: + { + } + break; + } + } } - #if 0 - room->CollisionDetection(this, detection_flags, objects); - #endif if (objects.empty()) { break; } } + room->grid_service.RemoveFromGridList(grid_list, this); + { + grid_list.clear(); + switch (entity_type) { + case ET_Player: + { + room->grid_service.AddHuman((Human*)this); + } + break; + case ET_Bullet: + { + room->grid_service.AddBullet((Bullet*)this); + } + break; + default: + { + room->grid_service.AddEntity(this); + } + break; + } + } + DestoryCollider(target_collider); DestoryCollider(a_collider); } @@ -87,7 +123,7 @@ void Entity::FindLocationWithTarget(Entity* target) void Entity::BroadcastFullState() { std::set grid_list; - room->grid_service.Get123456789(grid_id, grid_list); + room->grid_service.GetAllCells(grid_id, grid_list); for (auto& grid : grid_list) { for (Human* hum : grid->human_list) { hum->AddToNewObjects(this); @@ -98,7 +134,7 @@ void Entity::BroadcastFullState() void Entity::BroadcastDeleteState() { std::set grid_list; - room->grid_service.Get123456789(grid_id, grid_list); + room->grid_service.GetAllCells(grid_id, grid_list); for (auto& grid : grid_list) { for (Human* hum : grid->human_list) { hum->RemoveObjects(this); diff --git a/server/gameserver/gridservice.cc b/server/gameserver/gridservice.cc index e9cde68..937e259 100644 --- a/server/gameserver/gridservice.cc +++ b/server/gameserver/gridservice.cc @@ -56,13 +56,24 @@ bool GridService::BroderOverFlow(int x, int y) return x <= min_x_ || x >= max_x_ || y <= min_y_ || y >= max_y_; } -void GridService::Get123456789(int grid_id, std::set& grid_list) +void GridService::GetAllCells(int grid_id, std::set& grid_list) { for (size_t i = 1; i <= 9; ++i) { GetGridList(grid_id, i, grid_list); } } +void GridService::GetAllCellsByXy(int x, int y, std::set& grid_list) +{ + int new_x = x + cell_width_; + int new_y = y + cell_width_; + int new_grid_id = new_x/cell_width_ + (new_y/cell_width_) * cell_count_per_row_; + if (BroderOverFlow(new_x, new_y)) { + abort(); + } + GetAllCells(new_grid_id, grid_list); +} + void GridService::Get123(int grid_id, std::set& grid_list) { GetGridList(grid_id, 1, grid_list); @@ -117,7 +128,7 @@ void GridService::AddHuman(Human* hum) abort(); } cells_[hum->grid_id].human_list.insert(hum); - Get123456789(hum->grid_id, hum->grid_list); + GetAllCells(hum->grid_id, hum->grid_list); } void GridService::MoveHuman(Human* hum) @@ -158,7 +169,7 @@ void GridService::AddBullet(Bullet* bullet) abort(); } cells_[bullet->grid_id].bullet_list.insert(bullet); - Get123456789(bullet->grid_id, bullet->grid_list); + GetAllCells(bullet->grid_id, bullet->grid_list); } void GridService::MoveBullet(Bullet* bullet) @@ -246,6 +257,29 @@ bool GridService::InView(int a_grid, int b_grid) a_grid + grid_offset_arr_[8] == b_grid; } +void GridService::RemoveFromGridList(std::set& grid_list, Entity* entity) +{ + for (auto& grid : grid_list) { + switch (entity->entity_type) { + case ET_Player: + { + grid->human_list.erase((Human*)entity); + } + break; + case ET_Bullet: + { + grid->bullet_list.erase((Bullet*)entity); + } + break; + default: + { + grid->entity_list.erase(entity); + } + break; + } + } +} + void GridService::GetGridList(int grid_id, int offset, std::set& grid_list) { @@ -270,7 +304,7 @@ void GridService::ComputeDiff(int old_grid_id, int new_grid_id, #if 1 { std::set new_grid_list; - Get123456789(new_grid_id, new_grid_list); + GetAllCells(new_grid_id, new_grid_list); for (auto& cell : new_grid_list) { if (grid_list.find(cell) == grid_list.end()) { inc_grid_list.insert(cell); @@ -329,7 +363,7 @@ void GridService::ComputeDiff(int old_grid_id, int new_grid_id, Get123(old_grid_id, dec_grid_list); } else { std::set new_grid_list; - Get123456789(new_grid_id, new_grid_list); + GetAllCells(new_grid_id, new_grid_list); for (auto& cell : new_grid_list) { if (grid_list.find(cell) == grid_list.end()) { inc_grid_list.insert(cell); @@ -344,5 +378,5 @@ void GridService::ComputeDiff(int old_grid_id, int new_grid_id, #endif grid_list.clear(); - Get123456789(new_grid_id, grid_list); + GetAllCells(new_grid_id, grid_list); } diff --git a/server/gameserver/gridservice.h b/server/gameserver/gridservice.h index 67d5d1b..2f12519 100644 --- a/server/gameserver/gridservice.h +++ b/server/gameserver/gridservice.h @@ -28,13 +28,8 @@ class GridService void Init(int width, int height, int cell_width); void UnInit(); bool BroderOverFlow(int x, int y); - void Get123456789(int grid_id, std::set& grid_list); - void Get123(int grid_id, std::set& grid_list); - void Get456(int grid_id, std::set& grid_list); - void Get789(int grid_id, std::set& grid_list); - void Get147(int grid_id, std::set& grid_list); - void Get258(int grid_id, std::set& grid_list); - void Get369(int grid_id, std::set& grid_list); + void GetAllCells(int grid_id, std::set& grid_list); + void GetAllCellsByXy(int x, int y, std::set& grid_list); void AddHuman(Human* hum); void MoveHuman(Human* hum); @@ -49,8 +44,16 @@ class GridService bool HumanInGridList(Human* hum, std::set& grid_list); bool EntityInGridList(Entity* entity, std::set& grid_list); bool InView(int a_grid, int b_grid); + void RemoveFromGridList(std::set& grid_list, Entity* entity); private: + void Get123(int grid_id, std::set& grid_list); + void Get456(int grid_id, std::set& grid_list); + void Get789(int grid_id, std::set& grid_list); + void Get147(int grid_id, std::set& grid_list); + void Get258(int grid_id, std::set& grid_list); + void Get369(int grid_id, std::set& grid_list); + inline void GetGridList(int grid_id, int offset, std::set& grid_list); void ComputeDiff(int old_grid_id, int new_grid_id, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 70960cd..4fde2d6 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -802,6 +802,7 @@ void Human::FindLocation() } if (ret) { pos = new_pos; + room->grid_service.MoveHuman(this); return; } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index a45f86a..a4888f3 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -46,7 +46,6 @@ void Room::Init() xtimer_attacher.xtimer = &xtimer; grid_service.Init(MAP_WIDTH, MAP_HEIGHT, MAP_CELL_WIDTH); - ShuaAndroid(); CreateThings(); stats_timer_ = a8::Timer::Instance()->AddRepeatTimer( 1000 * 5, @@ -72,6 +71,7 @@ void Room::Init() &xtimer_attacher.timer_list_); } InitAirDrop(); + ShuaAndroid(); } void Room::UnInit() @@ -176,6 +176,7 @@ void Room::AddPlayer(Player* hum) human_hash_[hum->entity_uniid] = hum; ++alive_count_; grid_service.AddHuman(hum); + hum->FindLocation(); hum->RefreshView(); MatchTeam(hum); } @@ -215,6 +216,7 @@ void Room::ShuaAndroid() human_hash_[hum->entity_uniid] = hum; ++alive_count_; grid_service.AddHuman(hum); + hum->FindLocation(); hum->RefreshView(); } }