快捷搜索: 王者荣耀 脱发

用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;

}


效果可以看图。

经验分享 程序员 微信小程序 职场和发展