Pathfinding now returns the nodes to reach a destination in preparation for use w/AI pathfinding
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
cb24484dfe
commit
debf151c46
@ -45,9 +45,9 @@ void Pathfinding::Initialize(){
|
|||||||
nodeEnd = &nodes[(game->WORLD_SIZE.y / 2) * game->WORLD_SIZE.x + game->WORLD_SIZE.x-2];
|
nodeEnd = &nodes[(game->WORLD_SIZE.y / 2) * game->WORLD_SIZE.x + game->WORLD_SIZE.x-2];
|
||||||
}
|
}
|
||||||
|
|
||||||
int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upperLevel){
|
std::vector<vf2d> Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upperLevel){
|
||||||
float dist=sqrt(pow(endPos.x-startPos.x,2)+pow(endPos.y-startPos.y,2));
|
float dist=sqrt(pow(endPos.x-startPos.x,2)+pow(endPos.y-startPos.y,2));
|
||||||
if(dist>maxRange*24)return maxRange;
|
if(dist>maxRange*24)return {};
|
||||||
|
|
||||||
nodeStart=&nodes[int(startPos.y/24)*game->WORLD_SIZE.x+int(startPos.x/24)];
|
nodeStart=&nodes[int(startPos.y/24)*game->WORLD_SIZE.x+int(startPos.x/24)];
|
||||||
nodeEnd=&nodes[int(endPos.y/24)*game->WORLD_SIZE.x+int(endPos.x/24)];
|
nodeEnd=&nodes[int(endPos.y/24)*game->WORLD_SIZE.x+int(endPos.x/24)];
|
||||||
@ -118,6 +118,7 @@ int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upper
|
|||||||
{
|
{
|
||||||
int pathLength=INFINITE;
|
int pathLength=INFINITE;
|
||||||
sNode *p = nodeEnd;
|
sNode *p = nodeEnd;
|
||||||
|
std::vector<vf2d>finalPath;
|
||||||
while (p->parent != nullptr)
|
while (p->parent != nullptr)
|
||||||
{
|
{
|
||||||
if(pathLength==INFINITE){
|
if(pathLength==INFINITE){
|
||||||
@ -125,10 +126,12 @@ int Pathfinding::Solve_AStar(vf2d startPos,vf2d endPos,float maxRange,bool upper
|
|||||||
} else {
|
} else {
|
||||||
pathLength++;
|
pathLength++;
|
||||||
}
|
}
|
||||||
|
finalPath.push_back({float((*p).x),float((*p).y)});
|
||||||
p = p->parent;
|
p = p->parent;
|
||||||
}
|
}
|
||||||
return pathLength;
|
std::reverse(finalPath.begin(),finalPath.end());
|
||||||
|
return finalPath;
|
||||||
} else {
|
} else {
|
||||||
return INFINITE;
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -21,6 +21,6 @@ struct Pathfinding{
|
|||||||
sNode *nodeEnd = nullptr;
|
sNode *nodeEnd = nullptr;
|
||||||
|
|
||||||
void Initialize();
|
void Initialize();
|
||||||
//maxRange in tiles.
|
//maxRange in tiles. Returns the path as points.
|
||||||
int Solve_AStar(vf2d startPos,vf2d endPos,float maxRange=8,bool upperLevel=false);
|
std::vector<vf2d> Solve_AStar(vf2d startPos,vf2d endPos,float maxRange=8,bool upperLevel=false);
|
||||||
};
|
};
|
@ -460,6 +460,6 @@ std::vector<Buff>Player::GetBuffs(BuffType buff){
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Player::CanPathfindTo(vf2d pos,vf2d targetPos,float range){
|
bool Player::CanPathfindTo(vf2d pos,vf2d targetPos,float range){
|
||||||
int pathLength=path.Solve_AStar(pos,targetPos,8,upperLevel);
|
std::vector<vf2d>pathing=path.Solve_AStar(pos,targetPos,8,upperLevel);
|
||||||
return pathLength<8;//We'll say 7 tiles or less is close enough to 650 range. Have a little bit of wiggle room.
|
return pathing.size()>0&&pathing.size()<8;//We'll say 7 tiles or less is close enough to 650 range. Have a little bit of wiggle room.
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user