完成a星版本
This commit is contained in:
parent
6af635e301
commit
e40397fa60
@ -11,7 +11,11 @@
|
||||
#include "room.h"
|
||||
#include "entityfactory.h"
|
||||
|
||||
#ifdef FIND_PATH_TEST
|
||||
const int MAP_GRID_WIDTH = 40;
|
||||
#else
|
||||
const int MAP_GRID_WIDTH = 64;
|
||||
#endif
|
||||
|
||||
void MapInstance::Init()
|
||||
{
|
||||
|
@ -130,6 +130,10 @@ void MapService::AddCollider(ColliderComponent* collider)
|
||||
node->collider = collider;
|
||||
list_add_tail(&node->entry, head);
|
||||
node->next = top_node;
|
||||
#ifdef DEBUG
|
||||
node->x = x;
|
||||
node->y = y;
|
||||
#endif
|
||||
top_node = node;
|
||||
if (!bot_node) {
|
||||
bot_node = node;
|
||||
@ -235,10 +239,25 @@ int MapService::GetMap(int x, int y)
|
||||
#endif
|
||||
return TILE_STATE_CLOSED;
|
||||
}
|
||||
list_head* head = &map_cells_[x * y];
|
||||
list_head* head = &map_cells_[x + map_width_ * y];
|
||||
if (list_empty(head)) {
|
||||
return TILE_STATE_OPENED_COST1;
|
||||
} else {
|
||||
CellNode* node = list_first_entry(head, CellNode, entry);
|
||||
switch (node->collider->owner->GetEntityType()) {
|
||||
case ET_Obstacle:
|
||||
{
|
||||
Obstacle* obstacle = (Obstacle*)node->collider->owner;
|
||||
if (!obstacle->IsPermanent()) {
|
||||
return TILE_STATE_OPENED_COST1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
return TILE_STATE_CLOSED;
|
||||
}
|
||||
}
|
||||
@ -323,7 +342,10 @@ void MapService::FindPathUpdate(FindPathStatus* find_status)
|
||||
|
||||
steps++;
|
||||
MovePathPoint point;
|
||||
point.pos = a8::Vec2(node->x * cell_width_, node->y * cell_width_);
|
||||
point.pos = a8::Vec2(
|
||||
node->x * cell_width_ + cell_width_ / 2,
|
||||
node->y * cell_width_ + cell_width_ / 2
|
||||
);
|
||||
find_status->out_points.push_back(point);
|
||||
};
|
||||
}
|
||||
@ -382,5 +404,11 @@ void MapService::DoMove(FindPathStatus* find_status)
|
||||
if (target_distance < 1.0001f) {
|
||||
myself->SetPos(point->pos);
|
||||
++find_status->path_index;
|
||||
#ifdef DEBUG
|
||||
if (myself->IsCollisionInMapService()) {
|
||||
myself->IsCollisionInMapService();
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,10 @@ struct CellNode
|
||||
ColliderComponent* collider;
|
||||
list_head entry;
|
||||
CellNode* next = nullptr;
|
||||
#ifdef DEBUG
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct MovePathPoint
|
||||
|
@ -22,3 +22,6 @@ namespace google
|
||||
#include "framework/cpp/types.h"
|
||||
#include "framework/cpp/protoutils.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define FIND_PATH_TEST 1
|
||||
#endif
|
||||
|
@ -2913,12 +2913,24 @@ void Room::ZombieModeStart()
|
||||
#endif
|
||||
std::vector<Human*> human_list;
|
||||
for (auto& pair : human_hash_) {
|
||||
#ifdef FIND_PATH_TEST
|
||||
if (pair.second->IsAndroid()) {
|
||||
human_list.push_back(pair.second);
|
||||
}
|
||||
#else
|
||||
human_list.push_back(pair.second);
|
||||
#endif
|
||||
if (RoomMgr::Instance()->IsGM(pair.second->account_id)) {
|
||||
debug_trace = true;
|
||||
}
|
||||
}
|
||||
std::random_shuffle(human_list.begin(), human_list.end());
|
||||
#ifdef FIND_PATH_TEST
|
||||
for (size_t i = 0; i < 1; ++i) {
|
||||
Human* hum = human_list[i];
|
||||
hum->ChangeToRace(kZombieRace, 1);
|
||||
}
|
||||
#else
|
||||
for (size_t i = 0; i < 2; ++i) {
|
||||
Human* hum = human_list[i];
|
||||
hum->ChangeToRace(kZombieRace, 1);
|
||||
@ -2948,6 +2960,7 @@ void Room::ZombieModeStart()
|
||||
room->battle_report_timer_ = nullptr;
|
||||
}
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
Human* Room::GetOneCanEnableAndroid()
|
||||
@ -3285,7 +3298,11 @@ int Room::GetAliveCountByRace(RaceType_e race)
|
||||
size_t Room::GetRoomMaxPlayerNum()
|
||||
{
|
||||
if (room_mode_ == kZombieMode) {
|
||||
#ifdef FIND_PATH_TEST
|
||||
return 2;
|
||||
#else
|
||||
return MetaMgr::Instance()->zbmode_player_num;
|
||||
#endif
|
||||
} else {
|
||||
if (IsMiniRoom()) {
|
||||
return MINI_ROOM_MAX_PLAYER_NUM;
|
||||
|
@ -291,8 +291,11 @@ void ZombieModeAI::UpdateFindPath()
|
||||
} else {
|
||||
myself->room->map_service->FindPathUpdate(find_status);
|
||||
if (myself->room->map_service->FindFailed(find_status)) {
|
||||
#ifdef DEBUG
|
||||
a8::XPrintf("寻路失败 step:%d\n", {find_status->search_step});
|
||||
#endif
|
||||
myself->ClearFindPathStatus();
|
||||
ChangeToState(ZSE_Thinking);
|
||||
ChangeToState(ZSE_RandomWalk);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -424,13 +427,18 @@ void ZombieModeAI::ChangeToState(ZombieState_e to_state)
|
||||
break;
|
||||
case ZSE_FindPathMoving:
|
||||
{
|
||||
|
||||
#ifdef DEBUG
|
||||
a8::XPrintf("寻路成功\n", {});
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
}
|
||||
node_->main_state = to_state;
|
||||
node_->frameno = hum->room->GetFrameNo();
|
||||
node_->exec_frame_num = 0;
|
||||
#ifdef DEBUG1
|
||||
a8::XPrintf("changetostate %d\n", {to_state});
|
||||
#endif
|
||||
}
|
||||
|
||||
Human* ZombieModeAI::GetTarget()
|
||||
|
Loading…
x
Reference in New Issue
Block a user