用cocos2d3.0写一个srpg游戏-移动部分的实现
确定SRPG一个人物的移动范围,
我用的是比较傻的穷举法,
其实就是把人物可移动长度的每一个点都判断一下是否可以移动,
然后根据地形对人物影响的障碍等级,
每走一步,就少一个障碍等级的行走能力。
具体看代码
void SearchPathForSLG::init(TMXTiledMap* map, Point heroIndex,int runLength,bool movePath[][255]){
Point mapSize=Point(map->getMapSize().width,map->getMapSize().height);
//重置可移动范围
for (int i=0; i<255; i++) {
for (int j=0; j<255; j++) {
movePath[i][j]=false;
}
}
//设置移动的障碍等级
for (int i=0; i<255; i++) {
for (int j=0; j<255; j++) {
obstacleLevel[i][j]=TMXMapHelper::getMapTiledObstacleLevel(TMXMapHelper::getMapTiledType(Point(i,j), map));
}
}
//开始查找
search(heroIndex,runLength,movePath,mapSize);
}
//查找可移动范围-顺序为上,下,左,右
bool SearchPathForSLG::search(Point heroIndex, int count,bool movePath[][255],Point mapSize){
searchPath(Point(heroIndex.x,heroIndex.y-1),count,movePath,mapSize);
searchPath(Point(heroIndex.x,heroIndex.y+1),count,movePath,mapSize);
searchPath(Point(heroIndex.x-1,heroIndex.y),count,movePath,mapSize);
searchPath(Point(heroIndex.x+1,heroIndex.y),count,movePath,mapSize);
return false;
}
//查找对应位置是否可移动
bool SearchPathForSLG::searchPath(Point heroIndex, int count,bool movePath[][255],Point mapSize){
Point thisPoint=heroIndex;
//如果该位置没有越界,就继续盘但
if(thisPoint.x>=0&&thisPoint.y>=0&&thisPoint.x<mapSize.x&&thisPoint.y<mapSize.y){
int pointX=(int)thisPoint.x;
int pointY=(int)thisPoint.y;
//获取该位置的障碍等级
int thisObstacleLevel=obstacleLevel[pointX][pointY];
//如果障碍等级是99 说明改位置是不能移动的
if(thisObstacleLevel==99)
return false;
//如果当前可移动能力减掉障碍等级之后还能移动,就继续查找
if((count-thisObstacleLevel)>=0){
movePath[pointX][pointY]=true;
search(thisPoint,count-thisObstacleLevel,movePath,mapSize);
}
}
return false;
}
效果可以看图。