FindLocationWithTarget ok
This commit is contained in:
parent
e2bce87588
commit
308a64c62d
@ -67,19 +67,55 @@ void Entity::FindLocationWithTarget(Entity* target)
|
|||||||
new_pos_dir.Normalize();
|
new_pos_dir.Normalize();
|
||||||
for (float i = distance; i < 10000000; i += 5.0f) {
|
for (float i = distance; i < 10000000; i += 5.0f) {
|
||||||
pos = old_pos + new_pos_dir * i;
|
pos = old_pos + new_pos_dir * i;
|
||||||
|
std::set<GridCell*> new_grid_list;
|
||||||
|
room->grid_service.GetAllCellsByXy(pos.x, pos.y, new_grid_list);
|
||||||
|
|
||||||
std::vector<Entity*> objects;
|
std::vector<Entity*> objects;
|
||||||
int detection_flags = 0;
|
for (auto& grid : new_grid_list) {
|
||||||
{
|
for (Entity* entity : grid->entity_list) {
|
||||||
a8::SetBitFlag(detection_flags, ET_Obstacle);
|
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()) {
|
if (objects.empty()) {
|
||||||
break;
|
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(target_collider);
|
||||||
DestoryCollider(a_collider);
|
DestoryCollider(a_collider);
|
||||||
}
|
}
|
||||||
@ -87,7 +123,7 @@ void Entity::FindLocationWithTarget(Entity* target)
|
|||||||
void Entity::BroadcastFullState()
|
void Entity::BroadcastFullState()
|
||||||
{
|
{
|
||||||
std::set<GridCell*> grid_list;
|
std::set<GridCell*> grid_list;
|
||||||
room->grid_service.Get123456789(grid_id, grid_list);
|
room->grid_service.GetAllCells(grid_id, grid_list);
|
||||||
for (auto& grid : grid_list) {
|
for (auto& grid : grid_list) {
|
||||||
for (Human* hum : grid->human_list) {
|
for (Human* hum : grid->human_list) {
|
||||||
hum->AddToNewObjects(this);
|
hum->AddToNewObjects(this);
|
||||||
@ -98,7 +134,7 @@ void Entity::BroadcastFullState()
|
|||||||
void Entity::BroadcastDeleteState()
|
void Entity::BroadcastDeleteState()
|
||||||
{
|
{
|
||||||
std::set<GridCell*> grid_list;
|
std::set<GridCell*> grid_list;
|
||||||
room->grid_service.Get123456789(grid_id, grid_list);
|
room->grid_service.GetAllCells(grid_id, grid_list);
|
||||||
for (auto& grid : grid_list) {
|
for (auto& grid : grid_list) {
|
||||||
for (Human* hum : grid->human_list) {
|
for (Human* hum : grid->human_list) {
|
||||||
hum->RemoveObjects(this);
|
hum->RemoveObjects(this);
|
||||||
|
@ -56,13 +56,24 @@ bool GridService::BroderOverFlow(int x, int y)
|
|||||||
return x <= min_x_ || x >= max_x_ || y <= min_y_ || y >= max_y_;
|
return x <= min_x_ || x >= max_x_ || y <= min_y_ || y >= max_y_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GridService::Get123456789(int grid_id, std::set<GridCell*>& grid_list)
|
void GridService::GetAllCells(int grid_id, std::set<GridCell*>& grid_list)
|
||||||
{
|
{
|
||||||
for (size_t i = 1; i <= 9; ++i) {
|
for (size_t i = 1; i <= 9; ++i) {
|
||||||
GetGridList(grid_id, i, grid_list);
|
GetGridList(grid_id, i, grid_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GridService::GetAllCellsByXy(int x, int y, std::set<GridCell*>& 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<GridCell*>& grid_list)
|
void GridService::Get123(int grid_id, std::set<GridCell*>& grid_list)
|
||||||
{
|
{
|
||||||
GetGridList(grid_id, 1, grid_list);
|
GetGridList(grid_id, 1, grid_list);
|
||||||
@ -117,7 +128,7 @@ void GridService::AddHuman(Human* hum)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
cells_[hum->grid_id].human_list.insert(hum);
|
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)
|
void GridService::MoveHuman(Human* hum)
|
||||||
@ -158,7 +169,7 @@ void GridService::AddBullet(Bullet* bullet)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
cells_[bullet->grid_id].bullet_list.insert(bullet);
|
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)
|
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;
|
a_grid + grid_offset_arr_[8] == b_grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GridService::RemoveFromGridList(std::set<GridCell*>& 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,
|
void GridService::GetGridList(int grid_id, int offset,
|
||||||
std::set<GridCell*>& grid_list)
|
std::set<GridCell*>& grid_list)
|
||||||
{
|
{
|
||||||
@ -270,7 +304,7 @@ void GridService::ComputeDiff(int old_grid_id, int new_grid_id,
|
|||||||
#if 1
|
#if 1
|
||||||
{
|
{
|
||||||
std::set<GridCell*> new_grid_list;
|
std::set<GridCell*> new_grid_list;
|
||||||
Get123456789(new_grid_id, new_grid_list);
|
GetAllCells(new_grid_id, new_grid_list);
|
||||||
for (auto& cell : new_grid_list) {
|
for (auto& cell : new_grid_list) {
|
||||||
if (grid_list.find(cell) == grid_list.end()) {
|
if (grid_list.find(cell) == grid_list.end()) {
|
||||||
inc_grid_list.insert(cell);
|
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);
|
Get123(old_grid_id, dec_grid_list);
|
||||||
} else {
|
} else {
|
||||||
std::set<GridCell*> new_grid_list;
|
std::set<GridCell*> new_grid_list;
|
||||||
Get123456789(new_grid_id, new_grid_list);
|
GetAllCells(new_grid_id, new_grid_list);
|
||||||
for (auto& cell : new_grid_list) {
|
for (auto& cell : new_grid_list) {
|
||||||
if (grid_list.find(cell) == grid_list.end()) {
|
if (grid_list.find(cell) == grid_list.end()) {
|
||||||
inc_grid_list.insert(cell);
|
inc_grid_list.insert(cell);
|
||||||
@ -344,5 +378,5 @@ void GridService::ComputeDiff(int old_grid_id, int new_grid_id,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
grid_list.clear();
|
grid_list.clear();
|
||||||
Get123456789(new_grid_id, grid_list);
|
GetAllCells(new_grid_id, grid_list);
|
||||||
}
|
}
|
||||||
|
@ -28,13 +28,8 @@ class GridService
|
|||||||
void Init(int width, int height, int cell_width);
|
void Init(int width, int height, int cell_width);
|
||||||
void UnInit();
|
void UnInit();
|
||||||
bool BroderOverFlow(int x, int y);
|
bool BroderOverFlow(int x, int y);
|
||||||
void Get123456789(int grid_id, std::set<GridCell*>& grid_list);
|
void GetAllCells(int grid_id, std::set<GridCell*>& grid_list);
|
||||||
void Get123(int grid_id, std::set<GridCell*>& grid_list);
|
void GetAllCellsByXy(int x, int y, std::set<GridCell*>& grid_list);
|
||||||
void Get456(int grid_id, std::set<GridCell*>& grid_list);
|
|
||||||
void Get789(int grid_id, std::set<GridCell*>& grid_list);
|
|
||||||
void Get147(int grid_id, std::set<GridCell*>& grid_list);
|
|
||||||
void Get258(int grid_id, std::set<GridCell*>& grid_list);
|
|
||||||
void Get369(int grid_id, std::set<GridCell*>& grid_list);
|
|
||||||
|
|
||||||
void AddHuman(Human* hum);
|
void AddHuman(Human* hum);
|
||||||
void MoveHuman(Human* hum);
|
void MoveHuman(Human* hum);
|
||||||
@ -49,8 +44,16 @@ class GridService
|
|||||||
bool HumanInGridList(Human* hum, std::set<GridCell*>& grid_list);
|
bool HumanInGridList(Human* hum, std::set<GridCell*>& grid_list);
|
||||||
bool EntityInGridList(Entity* entity, std::set<GridCell*>& grid_list);
|
bool EntityInGridList(Entity* entity, std::set<GridCell*>& grid_list);
|
||||||
bool InView(int a_grid, int b_grid);
|
bool InView(int a_grid, int b_grid);
|
||||||
|
void RemoveFromGridList(std::set<GridCell*>& grid_list, Entity* entity);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void Get123(int grid_id, std::set<GridCell*>& grid_list);
|
||||||
|
void Get456(int grid_id, std::set<GridCell*>& grid_list);
|
||||||
|
void Get789(int grid_id, std::set<GridCell*>& grid_list);
|
||||||
|
void Get147(int grid_id, std::set<GridCell*>& grid_list);
|
||||||
|
void Get258(int grid_id, std::set<GridCell*>& grid_list);
|
||||||
|
void Get369(int grid_id, std::set<GridCell*>& grid_list);
|
||||||
|
|
||||||
inline void GetGridList(int grid_id, int offset,
|
inline void GetGridList(int grid_id, int offset,
|
||||||
std::set<GridCell*>& grid_list);
|
std::set<GridCell*>& grid_list);
|
||||||
void ComputeDiff(int old_grid_id, int new_grid_id,
|
void ComputeDiff(int old_grid_id, int new_grid_id,
|
||||||
|
@ -802,6 +802,7 @@ void Human::FindLocation()
|
|||||||
}
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pos = new_pos;
|
pos = new_pos;
|
||||||
|
room->grid_service.MoveHuman(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,6 @@ void Room::Init()
|
|||||||
xtimer_attacher.xtimer = &xtimer;
|
xtimer_attacher.xtimer = &xtimer;
|
||||||
grid_service.Init(MAP_WIDTH, MAP_HEIGHT, MAP_CELL_WIDTH);
|
grid_service.Init(MAP_WIDTH, MAP_HEIGHT, MAP_CELL_WIDTH);
|
||||||
|
|
||||||
ShuaAndroid();
|
|
||||||
CreateThings();
|
CreateThings();
|
||||||
stats_timer_ = a8::Timer::Instance()->AddRepeatTimer(
|
stats_timer_ = a8::Timer::Instance()->AddRepeatTimer(
|
||||||
1000 * 5,
|
1000 * 5,
|
||||||
@ -72,6 +71,7 @@ void Room::Init()
|
|||||||
&xtimer_attacher.timer_list_);
|
&xtimer_attacher.timer_list_);
|
||||||
}
|
}
|
||||||
InitAirDrop();
|
InitAirDrop();
|
||||||
|
ShuaAndroid();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Room::UnInit()
|
void Room::UnInit()
|
||||||
@ -176,6 +176,7 @@ void Room::AddPlayer(Player* hum)
|
|||||||
human_hash_[hum->entity_uniid] = hum;
|
human_hash_[hum->entity_uniid] = hum;
|
||||||
++alive_count_;
|
++alive_count_;
|
||||||
grid_service.AddHuman(hum);
|
grid_service.AddHuman(hum);
|
||||||
|
hum->FindLocation();
|
||||||
hum->RefreshView();
|
hum->RefreshView();
|
||||||
MatchTeam(hum);
|
MatchTeam(hum);
|
||||||
}
|
}
|
||||||
@ -215,6 +216,7 @@ void Room::ShuaAndroid()
|
|||||||
human_hash_[hum->entity_uniid] = hum;
|
human_hash_[hum->entity_uniid] = hum;
|
||||||
++alive_count_;
|
++alive_count_;
|
||||||
grid_service.AddHuman(hum);
|
grid_service.AddHuman(hum);
|
||||||
|
hum->FindLocation();
|
||||||
hum->RefreshView();
|
hum->RefreshView();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user