首页 > 代码库 > 用cocos2d3.0写一个srpg游戏-移动部分的实现

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

}


效果可以看图。


用cocos2d3.0写一个srpg游戏-移动部分的实现