# Cocos2d-x 寻路算法之三 A Star

3330人阅读 评论(5)

Figure 1

## 2.代码实现

float distanceBetweenTwoCells(float c1X,float c1Y, float c2X, float c2Y){

return sqrt(pow(c2X - c1X,2) + pow(c2Y - c1Y,2));
}
bool comparebyDistanceBetweenStartAndGoal(Cell *c1, Cell *c2){
float distanceOfC1AndGoal = c1->getDistance() +
distanceBetweenTwoCells((float)c1->getX(),(float)c1->getY(),(float)g_goalX,(float) g_goalY);

float distanceOfC2AndGoal = c2->getDistance() +
distanceBetweenTwoCells((float)c2->getX(),(float)c2->getY(),(float)g_goalX,(float) g_goalY);
if(distanceOfC1AndGoal <= distanceOfC2AndGoal){
return false;
}else{
return true;
}
}

    typedef bool (*compareTwoCells)(Cell *c1, Cell *c2);
void HelloWorld::startPathFinding(compareTwoCells compareMethod, int startX,int startY,int goalX,int goalY){
Cell *startCell = _m_Map.Get(startX, startY);
vector<Cell*> vecCells;
vecCells.push_back(startCell);
make_heap(vecCells.begin(),vecCells.end(),compareMethod);
startCell->setMarked(true);
Cell *nowProcessCell;

while(vecCells.size() != 0){
pop_heap(vecCells.begin(),vecCells.end(),compareMethod);
nowProcessCell = vecCells.back();
vecCells.pop_back();

if(nowProcessCell->getX() == _goalX && nowProcessCell->getY() == _goalY){//the goal is reach
return;
}

for(int i = 0; i < 8; ++i){ //check eight direction

int indexX = nowProcessCell->getX() + DIRECTION[i][0];
int indexY = nowProcessCell->getY() + DIRECTION[i][1];

if(indexX >= 0 && indexX < xLineCount && indexY >= 0 && indexY < yLineCount
&& _m_Map.Get(indexX,indexY)->getPassable() == true){//check is a OK cell or not
Cell *cell = _m_Map.Get(indexX,indexY);
float beforeDistance = DISTANCE[i] * cell->getWeight() + _m_Map.Get(nowProcessCell->getX(),
nowProcessCell->getY())->getDistance();//calculate the distance
if(cell->getMarked() == false){
cell->setMarked(true);
cell->setLastX(nowProcessCell->getX());
cell->setLastY(nowProcessCell->getY());
cell->setDistance(beforeDistance);
vecCells.push_back(cell);//only push the unmarked cell into the vector
push_heap(vecCells.begin(),vecCells.end(),compareMethod);
}else{// if find a lower distance, update it
if(beforeDistance < cell->getDistance()){
cell->setDistance(beforeDistance);
cell->setLastX(nowProcessCell->getX());
cell->setLastY(nowProcessCell->getY());
make_heap(vecCells.begin(),vecCells.end(),compareMethod);//distance change,so make heap again
}
}
}

}
}
}
startPathFinding(comparebyDistanceBetweenStartAndGoal,_playerX,_playerY,_goalX,_goalY);//A star path finding demo    

## 5. Cocos2d-x A Star 源码下载：

(请用7z解压，开发工具vs2010)

http://www.waitingfy.com/?attachment_id=828

A*算法应用可以看下这篇文章《贪吃蛇 AI 的实现 snake AI

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
关注我的新浪微博

互粉啊！！

联系我
个人资料
• 访问：551878次
• 积分：7608
• 等级：
• 排名：第2894名
• 原创：206篇
• 转载：1篇
• 译文：0篇
• 评论：157条
博客专栏
 cocos2d-x 小游戏实战 文章：13篇 阅读：42688
评论排行
最新评论