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

前端之家收集整理的这篇文章主要介绍了Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

下面的设计稍微繁琐一些,有必要把思路说清楚。

下一步的主要实现当我们点击Go按钮后,得到骰子随机数,就是行走的步数,根据步数获取行走的路径,然后角色根据路径移动位置。大体流程如图所示:



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




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


我们开始修改GameBaseScene代码


  1. GameBaseScene.h
  2. //新添加变量 表示地图块中每块的宽高
  3. const int tiledWidth = 32;
  4. const int tiledHeight = 32;
  5.  
  6. class GameBaseScene: public Layer
  7. {
  8. public:
  9. int tiledColsCount; //关卡地图总的列数
  10. int tiledRowsCount;//关卡地图总的行数
  11.  
  12. bool** canPassGrid;//根据地图总的行列数创建的二维数组
  13.  
  14. virtual void initTiledGrid();//用来初始化canPassGrid数组
  15. void setWayPassToGrid();//根据地图图层way,设置canPassGrid相应的值为true
  16. void onExit();//退出时需要释放某些变量空间
  17. void addGoButton();//添加GO 按钮
  18. };


修改GameBaseScene.cpp文件


  1. init方法添加新增函数调用
  2. bool GameBaseScene::init()
  3. {
  4. …………………..
  5. addGoButton();
  6. initTiledGrid();
  7. setWayPassToGrid();
  8. …………….
  9. }
  10. void GameBaseScene::setWayPassToGrid()
  11. {
  12. TMXLayer* wayLayer = _map->layerNamed("way");//获取地图way图层
  13.  
  14. Size _mapSize = wayLayer->getLayerSize(); //获取way图层大小
  15. //根据way图层,获取道路的坐标并转换成地图的行列值,设置canPassGrid相应的行列值为true,表示人物可以从这里通过
  16. for (int j = 0; j < _mapSize.width; j++) {
  17. for (int i = 0; i < _mapSize.height; i++) {
  18. Sprite* _sp = wayLayer->tileAt(Point(j,i));
  19. if (_sp)
  20. {
  21. float x = _sp->getPositionX();
  22. float y = _sp->getPositionY();
  23. int col = x/tiledWidth;
  24. int row = y/tiledHeight;
  25. canPassGrid[row][col] = true;
  26. log("canPassGrid row= %d,col =%d,canpass = %d",row,col,canPassGrid[row][col]);
  27. }
  28. }
  29. }
  30. log("setWayPassToGrid finished");
  31. }


  1. //这个就是简单 的添加Go按钮
  2. void GameBaseScene::addGoButton()
  3. {
  4. Sprite* goButton = Sprite::create(GO_BUTTON);
  5. goButton->setPosition(ccp(tableStartPosition_x+2*tableWidth,tableStartPosition_y-tableHeight*5));
  6. addChild(goButton);
  7. }
  8. //当退出调用函数,释放canPassGrid占用的空间
  9. void GameBaseScene::onExit()
  10. {
  11. CC_SAFE_DELETE(canPassGrid);
  12. Layer::onExit();
  13.  
  14. }


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

SeaScene.cpp实现如下

  1. SeaScene实现父类GameBaseSceneinitTiledGrid方法
  2.  
  3. void GameBaseScene::initTiledGrid()
  4. {
  5. tiledColsCount = 20;//地图总的列数
  6. tiledRowsCount = 15;//地图总的行数
  7.  
  8. //根据行列数创建二维数组canPassGrid
  9. canPassGrid = new bool*[tiledRowsCount];
  10. for(int i=0;i<tiledRowsCount;i++)
  11. canPassGrid[i]=new bool [tiledColsCount];
  12.  
  13. //给canPassGrid设置默认值为false 表示不能通过
  14. for(int row = 0;row<tiledRowsCount;row++)
  15. {
  16. for(int col = 0;col<tiledColsCount;col++)
  17. {
  18. canPassGrid[row][col] = false;
  19. }
  20. }
  21. log("");
  22. }


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

对比一下sea.tmx文件中的way图层 ,看看行列值是不是一致了



点击下载代码

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


获取路径稍微复杂一些,我们分多章介绍


未完待续

猜你在找的Cocos2d-x相关文章