Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

时间:2023-03-10 01:29:25
Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

以下是一些设计略显繁琐,有必要清除思维。

下一个主要的成就,当我们点击Gobutton后,得到一个随机数骰子,是走了几步,它是基于以下步骤行走路径的数目,然后移动位置的基于角色的路径。

流程如图普遍认为:

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

这当中getPath()获取路径的方法有必要说清楚,还是看流程图吧

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlkZWd1bzE5Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

思路大体是这种,代码实现上可能存在一些区别。可是不影响我们的总体设计思想。

我们開始改动GameBaseScene代码

GameBaseScene.h
//新加入变量 表示地图块中每块的宽高
const int tiledWidth = 32;
const int tiledHeight = 32; class GameBaseScene: public Layer
{
public:
int tiledColsCount; //关卡地图总的列数
int tiledRowsCount;//关卡地图总的行数 bool** canPassGrid;//依据地图总的行列数创建的二维数组 virtual void initTiledGrid();//用来初始化canPassGrid数组
void setWayPassToGrid();//依据地图图层way,设置canPassGrid对应的值为true
void onExit();//退出时须要释放某些变量空间 void addGoButton();//加入GO button
};

改动GameBaseScene.cpp文件

在init方法中加入新增函数的调用
bool GameBaseScene::init()
{
…………………..
addGoButton();
initTiledGrid();
setWayPassToGrid();
…………….
}
void GameBaseScene::setWayPassToGrid()
{
TMXLayer* wayLayer = _map->layerNamed("way");//获取地图way图层 Size _mapSize = wayLayer->getLayerSize(); //获取way图层大小
//依据way图层。获取道路的坐标并转换成地图的行列值,设置canPassGrid对应的行列值为true,表示人物能够从这里通过
for (int j = 0; j < _mapSize.width; j++) {
for (int i = 0; i < _mapSize.height; i++) {
Sprite* _sp = wayLayer->tileAt(Point(j, i));
if (_sp)
{
float x = _sp->getPositionX();
float y = _sp->getPositionY();
int col = x/tiledWidth;
int row = y/tiledHeight;
canPassGrid[row][col] = true;
log("canPassGrid row= %d ,col =%d ,canpass = %d" ,row,col,canPassGrid[row][col]);
} }
}
log("setWayPassToGrid finished");
}

//这个就是简单 的加入Gobutton
void GameBaseScene::addGoButton()
{
Sprite* goButton = Sprite::create(GO_BUTTON);
goButton->setPosition(ccp(tableStartPosition_x+2*tableWidth,tableStartPosition_y-tableHeight*5));
addChild(goButton);
}
//当退出是调用该函数。释放canPassGrid占用的空间
void GameBaseScene::onExit()
{ CC_SAFE_DELETE(canPassGrid);
Layer::onExit(); }

以下看一下initTiledGrid()方法的实现。因为每一个关卡地图大小不一样,所以这种方法的实现放到了子类中

SeaScene.cpp实现例如以下

SeaScene实现父类GameBaseScene的initTiledGrid方法

void GameBaseScene::initTiledGrid()
{
tiledColsCount = 20;//地图总的列数
tiledRowsCount = 15;//地图总的行数 //依据行列数创建二维数组canPassGrid
canPassGrid = new bool*[tiledRowsCount];
for(int i=0;i<tiledRowsCount;i++)
canPassGrid[i]=new bool [tiledColsCount]; //给canPassGrid设置默认值为false 表示不能通过
for(int row = 0;row<tiledRowsCount;row++)
{
for(int col = 0;col<tiledColsCount;col++)
{
canPassGrid[row][col] = false;
}
}
log(""); }

Ok 至此我们已经能够调试一下代码,从log中能够看到已经打印出了canPassGrid数组中能够通过的行列值了

对照一下sea.tmx文件里的way图层 。看看行列值是不是一致了

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlkZWd1bzE5Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

点击下载代码

http://download.****.net/detail/lideguo1979/8276135

稍微更复杂的路径,我们分多章

待续