完成a星算法集成
This commit is contained in:
parent
83be6833b6
commit
dd6369d5e6
@ -378,3 +378,22 @@ const int TERMINATOR_BUFF_ID = 1033;
|
|||||||
|
|
||||||
const int TURN_OVER_SKILL_ID = 41001;
|
const int TURN_OVER_SKILL_ID = 41001;
|
||||||
|
|
||||||
|
/*
|
||||||
|
1 2 3
|
||||||
|
4 5 6
|
||||||
|
7 8 9
|
||||||
|
*/
|
||||||
|
const int GRID9_AGROUD_CELL_NUM = 8;
|
||||||
|
const int GRID9_AGROUND_CELL_INDEX[GRID9_AGROUD_CELL_NUM][2] =
|
||||||
|
{
|
||||||
|
{-1, -1}, //1
|
||||||
|
{0, -1}, //2
|
||||||
|
{1, -1}, //3
|
||||||
|
|
||||||
|
{-1, 0}, //4
|
||||||
|
{1, 0}, //6
|
||||||
|
|
||||||
|
{-1, 1}, //7
|
||||||
|
{0, 1}, //8
|
||||||
|
{1, 1} //9
|
||||||
|
};
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "precompile.h"
|
#include "precompile.h"
|
||||||
|
|
||||||
#include "mapsearchnode.h"
|
#include "mapsearchnode.h"
|
||||||
|
#include "mapservice.h"
|
||||||
|
|
||||||
float MapSearchNode::GoalDistanceEstimate(MapSearchNode &node_goal)
|
float MapSearchNode::GoalDistanceEstimate(MapSearchNode &node_goal)
|
||||||
{
|
{
|
||||||
@ -21,19 +22,36 @@ bool MapSearchNode::IsGoal(MapSearchNode &node_goal)
|
|||||||
|
|
||||||
bool MapSearchNode::GetSuccessors(AStarSearch<MapSearchNode> *astarsearch, MapSearchNode *parent_node)
|
bool MapSearchNode::GetSuccessors(AStarSearch<MapSearchNode> *astarsearch, MapSearchNode *parent_node)
|
||||||
{
|
{
|
||||||
return false;
|
int parent_x = -1;
|
||||||
|
int parent_y = -1;
|
||||||
|
|
||||||
|
if (parent_node) {
|
||||||
|
parent_x = parent_node->x;
|
||||||
|
parent_y = parent_node->y;
|
||||||
|
}
|
||||||
|
|
||||||
|
MapSearchNode new_node;
|
||||||
|
new_node.map_service = map_service;
|
||||||
|
for (int index = 0; index < GRID9_AGROUD_CELL_NUM; ++index) {
|
||||||
|
int cell_x = x + GRID9_AGROUND_CELL_INDEX[index][0];
|
||||||
|
int cell_y = y + GRID9_AGROUND_CELL_INDEX[index][1];
|
||||||
|
if ((map_service->GetMap(cell_x, cell_y ) < TILE_STATE_CLOSED) &&
|
||||||
|
!((parent_x == cell_x) && (parent_y == cell_y))
|
||||||
|
) {
|
||||||
|
new_node = MapSearchNode(cell_x, cell_y);
|
||||||
|
astarsearch->AddSuccessor(new_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
float MapSearchNode::GetCost(MapSearchNode &successor)
|
float MapSearchNode::GetCost(MapSearchNode &successor)
|
||||||
{
|
{
|
||||||
#if 1
|
|
||||||
return 1.0f;
|
|
||||||
#else
|
|
||||||
if (x != successor.x && y != successor.y) {
|
if (x != successor.x && y != successor.y) {
|
||||||
return (float) (NavTileHandle::pCurrNavTileHandle->getMap( x, y ) + 0.41421356/* ±¾ÉíÓÐÖÁÉÙ1µÄÖµ */); //sqrt(2)
|
return (float)(map_service->GetMap(x, y) + 0.41421356);
|
||||||
}
|
}
|
||||||
return (float) NavTileHandle::pCurrNavTileHandle->getMap( x, y );
|
return (float)map_service->GetMap(x, y);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapSearchNode::IsSameState(MapSearchNode &rhs)
|
bool MapSearchNode::IsSameState(MapSearchNode &rhs)
|
||||||
|
@ -2,12 +2,15 @@
|
|||||||
|
|
||||||
#include "framework/stlastar.h"
|
#include "framework/stlastar.h"
|
||||||
|
|
||||||
|
class MapService;
|
||||||
class MapSearchNode
|
class MapSearchNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int x = 0; // the (x,y) positions of the node
|
int x = 0; // the (x,y) positions of the node
|
||||||
int y = 0;
|
int y = 0;
|
||||||
|
MapService* map_service = nullptr;
|
||||||
|
|
||||||
|
MapSearchNode() {}
|
||||||
MapSearchNode(int px, int py) {x = px; y = py; }
|
MapSearchNode(int px, int py) {x = px; y = py; }
|
||||||
|
|
||||||
float GoalDistanceEstimate(MapSearchNode &node_goal);
|
float GoalDistanceEstimate(MapSearchNode &node_goal);
|
||||||
|
@ -227,12 +227,36 @@ void MapService::GetColliders(Room* room,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int MapService::GetMap(int x, int y)
|
||||||
|
{
|
||||||
|
if (!IsValidPos(x, y)) {
|
||||||
|
return TILE_STATE_CLOSED;
|
||||||
|
}
|
||||||
|
list_head* head = &map_cells_[x * y];
|
||||||
|
if (list_empty(head)) {
|
||||||
|
return TILE_STATE_OPENED_COST1;
|
||||||
|
} else {
|
||||||
|
return TILE_STATE_CLOSED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int MapService::GetGridId(float world_x, float world_y)
|
int MapService::GetGridId(float world_x, float world_y)
|
||||||
{
|
{
|
||||||
int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_;
|
int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_;
|
||||||
return grid_id;
|
return grid_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MapService::IsValidPos(int x, int y)
|
||||||
|
{
|
||||||
|
if (x < 0 ||
|
||||||
|
y < 0 ||
|
||||||
|
x >= map_width_ ||
|
||||||
|
y >= map_height_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
FindPathStatus* MapService::AddFindPathRequest(Human* hum,
|
FindPathStatus* MapService::AddFindPathRequest(Human* hum,
|
||||||
const a8::Vec2& start_pos,
|
const a8::Vec2& start_pos,
|
||||||
const a8::Vec2& end_pos,
|
const a8::Vec2& end_pos,
|
||||||
|
@ -5,6 +5,17 @@
|
|||||||
class Human;
|
class Human;
|
||||||
class ColliderComponent;
|
class ColliderComponent;
|
||||||
|
|
||||||
|
enum TILE_STATE
|
||||||
|
{
|
||||||
|
TILE_STATE_OPENED_COST0 = 0,
|
||||||
|
TILE_STATE_OPENED_COST1 = 1,
|
||||||
|
TILE_STATE_OPENED_COST2 = 2,
|
||||||
|
TILE_STATE_OPENED_COST3 = 3,
|
||||||
|
TILE_STATE_OPENED_COST4 = 4,
|
||||||
|
TILE_STATE_OPENED_COST5 = 5,
|
||||||
|
TILE_STATE_CLOSED = 9
|
||||||
|
};
|
||||||
|
|
||||||
struct CellNode
|
struct CellNode
|
||||||
{
|
{
|
||||||
ColliderComponent* collider;
|
ColliderComponent* collider;
|
||||||
@ -52,6 +63,7 @@ class MapService
|
|||||||
float world_x,
|
float world_x,
|
||||||
float world_y,
|
float world_y,
|
||||||
std::set<ColliderComponent*>& colliders);
|
std::set<ColliderComponent*>& colliders);
|
||||||
|
int GetMap(int x, int y);
|
||||||
|
|
||||||
FindPathStatus* AddFindPathRequest(Human* hum,
|
FindPathStatus* AddFindPathRequest(Human* hum,
|
||||||
const a8::Vec2& start_pos,
|
const a8::Vec2& start_pos,
|
||||||
@ -65,6 +77,7 @@ class MapService
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
int GetGridId(float world_x, float world_y);
|
int GetGridId(float world_x, float world_y);
|
||||||
|
bool IsValidPos(int x, int y);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
list_head* map_cells_ = nullptr;
|
list_head* map_cells_ = nullptr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user