cocos2dx下的A星算法
这是我依据这篇博文http://hi.baidu.com/wsapyoemdfacmqr/item/bdfb5c0a74c904d01ef0466d。来在cocos2dx上编写。这是终于的效果图:
红色的地方是执行轨迹,黑色是禁止区域,接下来是代码,请结合那篇博文观看:
首先创建地板类,必需要有x和y,还有依据那篇博文的h和g。这是h文件里的代码:
#include "cocos2d.h"
typedef enum _FloorState
{
FloorGround,
FloorRiver
} FloorState;
class Floor : public cocos2d::LayerColor
{
public:
Floor();
~Floor(){}
static int at(int x, int y);
static Floor * create(const cocos2d::Color4B& color);
bool initWithColor(const cocos2d::Color4B& color);
int getF();
private:
CC_SYNTHESIZE(int, _x, X);
CC_SYNTHESIZE(int, _y, Y);
CC_SYNTHESIZE(int, _h, H);
CC_SYNTHESIZE(int, _g, G);
CC_SYNTHESIZE(FloorState, _landForm, LandForm);
CC_SYNTHESIZE(Floor *, _lastFloor, LastFloor);
};
基本上没有什么难度,另外,那个静态方法at使用了从数组中高速获取地板。
然后是cpp文件:
#include "Floor.h"
USING_NS_CC;
Floor::Floor()
{
_x = 0;
_y = 0;
_h = -1;
_g = -1;
_lastFloor = NULL;
}
int Floor::at(int x, int y)
{
return x + 28 * y;
}
Floor *Floor::create(const cocos2d::Color4B &color)
{
Floor *_floor = new Floor();
if ( _floor && _floor -> initWithColor( color ) )
{
_floor -> autorelease();
return _floor;
}
delete _floor;
_floor = NULL;
return NULL;
}
bool Floor::initWithColor(const cocos2d::Color4B &color)
{
if ( LayerColor::initWithColor(color, 39, 39) )
{
return true;
}
return false;
}
int Floor::getF()
{
return _h + _g;
}
然后在执行的Layer中:
void MainScene::createGround()
{
for (int y = 0; y < 18; y++)
{
for (int x = 0; x < 28; x++)
{
auto _floor = Floor::create( Color4B(255, 255, 255, 255) );
_floor -> setPosition(x * (_floor -> getContentSize().width + 1), y * (_floor -> getContentSize().height + 1));
_floor -> setX(x);
_floor -> setY(y);
_floor -> setLandForm( FloorGround );
this -> addChild( _floor );
if ( (x == 15 && y < 7) || (x == 3 && y < 10) || (y == 12 && x < 20) || (x == 5 && y > 8) || (x == 13 && y > 1) )
{
_floor -> setColor( Color3B(0, 0, 0) );
_floor -> setLandForm( FloorRiver );
}
ground.pushBack( _floor );
}
}
}
当中,这种方法:_floor -> setLandForm( FloorRiver )使用来制造禁止区域
然后加入起点和终点:
end = Floor::create( Color4B(0, 255, 255, 10) );
end -> setPosition( (ground.at( Floor::at(24, 14) )) -> getPosition() );
end -> setX(24);
end -> setY(14);
this -> addChild( end );
origin = Floor::create( Color4B(255, 255, 0, 255) );
origin -> setPosition( (ground.at( Floor::at(0, 0) )) -> getPosition() );
origin -> setX(0);
origin -> setY(0);
origin -> setH( fabs((end -> getX() - origin -> getX())) + fabs( end -> getY() - origin -> getY() ) );
origin -> setG(0);
this -> addChild( origin );
open.pushBack( origin );
在这些完毕后,就是须要使用A*算法来计算出路径了
首先从open数组中寻找F最小的地板;之后。将上下左右的地板做个推断,是否增加数组中。这部分放在一个死循环中,当增加的地板正是终点时,能够结束:
while (1)
{
Vector< Floor * >::iterator index = open.begin();
Vector< Floor * >::iterator minF = index;
for (; index != open.end(); index++)
{
if ( (*index) -> getF() < (*minF) -> getF() )
{
minF = index;
}
}
Floor *_origin = (*minF);
handleFloor(_origin, _origin -> getX(), _origin -> getY() - 1);
handleFloor(_origin, _origin -> getX(), _origin -> getY() + 1);
handleFloor(_origin, _origin -> getX() - 1, _origin -> getY());
handleFloor(_origin, _origin -> getX() + 1, _origin -> getY());
open.eraseObject( _origin );
close.pushBack( _origin );
_origin -> setColor( Color3B(0, 255, 0) );
Floor *getEnd = open.at( open.size() - 1 );
if ( getEnd -> getX() == end -> getX() && getEnd -> getY() == end -> getY() )
{
CCLOG("ENDG");
return;
}
}
handleFloor函数是用来推断该地板是否可以增加数组中
void MainScene::handleFloor(Floor *_floor, int x, int y)
{
if ( x < 0 || y < 0 )
{
return;
}
Floor *handle = ground.at( Floor::at(x, y) );
handle -> setX(x);
handle -> setY(y);
handle -> setH( fabs((end -> getX() - handle -> getX())) + fabs( end -> getY() - handle -> getY() ) );
handle -> setG( fabs((origin -> getX() - handle -> getX())) + fabs( origin -> getY() - handle -> getY() ) );
JUDGE( handle, _floor );
}
#define JUDGE(__FLOOR__, __LAST__) \
if ( !open.contains(__FLOOR__) && !close.contains(__FLOOR__) && __FLOOR__ -> getLandForm() != FloorRiver ) \
{ \
open.pushBack( __FLOOR__ ); \
__FLOOR__ -> setColor( Color3B(100, 100, 100) ); \
__FLOOR__ -> setLastFloor( __LAST__ ); \
} \
之后,就是取出open数组终的最后一块地板,并能够获取这块地板的上一块地板。并将其颜色改变
Floor *index = open.at( open.size() - 1 );
while ( index -> getLastFloor() != NULL )
{
index -> setColor( Color3B(255, 0, 0) );
index = index -> getLastFloor();
}
在这里下载
cocos2dx下的A星算法的更多相关文章
- Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问
A *搜索算法称为A星算法.这是一个在图形平面,路径.求出最低通过成本的算法. 经常使用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上. 首先:1.在Map地图中任取2个点,開始点和结束点 ...
- 算法起步之A星算法
原文:算法起步之A星算法 用途: 寻找最短路径,优于bfs跟dfs 描述: 基本描述是,在深度优先搜索的基础上,增加了一个启发式算法,在选择节点的过程中,不是盲目选择,而是有目的的选的,F=G+H,f ...
- Java开源-astar:A 星算法
astar A星算法Java实现 一.适用场景 在一张地图中,绘制从起点移动到终点的最优路径,地图中会有障碍物,必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (如果有路径)采用“结点与结点的父 ...
- A星算法(Java实现)
一.适用场景 在一张地图中.绘制从起点移动到终点的最优路径,地图中会有障碍物.必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (假设有路径)採用"结点与结点的父节点"的关系从 ...
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]
Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...
- 【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明 ...
- POJ 2449 Remmarguts' Date (SPFA + A星算法) - from lanshui_Yang
题目大意:给你一个有向图,并给你三个数s.t 和 k ,让你求从点 s 到 点 t 的第 k 短的路径.如果第 k 短路不存在,则输出“-1” ,否则,输出第 k 短路的长度. 解题思路:这道题是一道 ...
- A*搜寻算法(A星算法)
A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...
- 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...
随机推荐
- Opencv 视频转为图像序列
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50283303 基于OpenCV的视频转 ...
- Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...
- Qt之窗体拖拽、自适应分辨率、自适应大小
简述 在自定义无边框.标题栏的界面中,需要自己实现最小化.最大化.关闭.窗体背景等功能.最小化.最大化.关闭等按钮设计及功能比较简单,这里就不多做介绍.今天主要介绍一下绘制背景的问题,主要实现自适应屏 ...
- HDU 4335 Contest 4
利用降幂公式..呃,还是自己去搜题解吧.知道降幂公式后,就不难了. #include <iostream> #include <cstdio> #include <alg ...
- 关于Javakeywordsynchronized——单例模式的思考
精彩的设计模式盛宴刚刚落下帷幕.三天的时间.真是学习到了非常多.当中,遗留的非常多的问题.今天就谈谈synchronized这个keyword.关于对synchronizedkeyword的思考是从单 ...
- oracle 时间戳TIMESTAMP
//数据库 UPDATETIMESTAMP TIMESTAMP(6) //dto /** 更新时间戳 **/ private String updatetimestamp; //dao //插入操作 ...
- zzulioj--1707--丧心病狂的计数(水题)
1707: 丧心病狂的计数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 237 Solved: 105 SubmitStatusWeb Board ...
- 搞定ubuntu下环境变量的配置
Ubuntu Linux系统环境变量配置文件: /etc/profile : 在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. ...
- BZOJ 2005 容斥原理
思路: 题目让求的是 Σgcd(i,j) (i<=n,j<=m) n,m不同 没法线性筛 怎么办? 容斥原理!! f[x]表示gcd(i,j)=x的个数 g[x]为 存在公约数=x 的数对 ...
- MyBatis数据持久化(一)准备工作
MyBatis简介 mybatis的前生是ibatis,它是一款非常优秀的java持久层框架,所有sql语句写在配置文件中,和另外一款比较知名的orm框架hibernate比起来显得更加小巧灵活,也是 ...