上篇我们完成了地图的信息获取和碰撞检测,这篇我们整合到程序中。

在这之前我们改造一下Tank类,使它更加模块化,共容易理解:

1.改造后的Tank类声明如下:

  1. class Tank : public CCSprite
  2. {
  3. public :
  4. Tank();
  5. ~Tank();
  6.  
  7. static Tank* createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
  8. void initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
  9. void command(enumOrder order);
  10. TileMapInfo* mTileMapInfo;
  11. };

static Tank* createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
void initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);

可以看到这两个函数后面都多了TileMapInfo类的指针。

我们可以在坦克中使用这个指针来检测是否碰撞。

2.我们实现void initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);

  1. void Tank::initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo)
  2. {
  3. initWithSpriteFrameName(tankTypeName);
  4. mTileMapInfo = tileMapInfo;
  5.  
  6. //将坦克放入地图层中
  7. mTileMapInfo->getTileMap()->addChild(this);
  8.  
  9. //缩放到合适大小
  10. CCTMXTiledMap* tmxTileMap = mTileMapInfo->getTileMap();
  11. CCSize tileSize = tmxTileMap->getTileSize();
  12. CCSize tankSize = getContentSize();
  13. //比地图上砖块小一点
  14. setScale((tileSize.height * 2-4) / (tankSize.height));
  15. }

上面函数中,我们先把Tank类自己加入了地图层中,这样更方便我们进行一个位置计算。

然后缩放到了比地图上一整个砖块小一点的大小,这样可以正常通过砖块之间的通道。

3.简单的实现static Tank* createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);来返回一个Tank实例:

  1. Tank* Tank::createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo)
  2. {
  3. CCSpriteFrameCache* pCache = CCSpriteFrameCache::sharedSpriteFrameCache();
  4. pCache->addSpriteFramesWithFile("tank.plist");
  5.  
  6. Tank* tank = new Tank();
  7. tank->initTankWithTankType(tankTypeName, tileMapInfo);
  8. tank->autorelease();
  9.  
  10. return tank;
  11. }

可以看到我们添加了plist文件,然后从中加载了tankTypeName类型的Tank精灵,然后初始化,最后加入自动释放列表。

4.然后在void command(enumOrder order);函数中,我们在命令控制中加入检测碰撞的函数:

  1. bool Tank::command(enumOrder order)
  2. {
  3. float stepX = 0.0f;
  4. float stepY = 0.0f;
  5. float fRotation = getRotation();
  6.  
  7. switch (order)
  8. {
  9. case cmdNothing:
  10. break;
  11. case cmdGoUP:
  12. stepY = 1.0f;
  13. fRotation = 0.0f;
  14. break;
  15. case cmdGoDown:
  16. stepY = -1.0f;
  17. fRotation = 180.0f;
  18. break;
  19. case cmdGoLeft:
  20. stepX = -1.0f;
  21. fRotation = 270.0f;
  22. break;
  23. case cmdGoRight:
  24. stepX = 1.0f;
  25. fRotation = 90.0f;
  26. break;
  27. case cmdFire:
  28. //调用子弹开火
  29. return mBullet->fire();
  30. default:
  31. break;
  32. }
  33.  
  34. //根据运行方向旋转坦克
  35. setRotation(fRotation);
  36.  
  37. //检测地图上的碰撞
  38. CCRect rect = this->boundingBox();
  39. if (!mTileMapInfo->collisionTest(CCRectMake(rect.getMinX() + stepX,
  40. rect.getMinY() + stepY, rect.size.width, rect.size.height)))
  41. {
  42. setPositionX(getPositionX() + stepX);
  43. setPositionY(getPositionY() + stepY);
  44. return true;
  45. }
  46.  
  47. return false;
  48. }

可以看到我们跟之前的Tank类的command函数中多了碰撞检测,

先通过boundingBox获取Tank在地图中的矩形,然后传入移动后的矩形,

通过TileMapInfo类中的collisionTest碰撞函数,来检测是否碰撞,

如果碰撞则不移动,如果没有碰撞则按照stepX和stepY分量进行移动位置。

5.Tank类改造完了,最后我们需要在CityScene中初始化我们的新 TileMapInfo类和Tank类:

  1. bool CityScene::init()
  2. {
  3. CCLayer::init();
  4.  
  5. //初始化地图信息
  6. TileMapInfo* tileMapInfo = TileMapInfo::createMapInfoWithFile("Round1.tmx");
  7. CCTMXTiledMap* tmxTileMap = tileMapInfo->getTileMap();
  8. this->addChild(tmxTileMap);
  9.  
  10. //在已有的地图上,创建玩家坦克
  11. mPlayerTank[0] = Tank::createTankWithTankType("player2U.png", tileMapInfo);
  12.  
  13. //放到地图中初始化位置
  14. CCSize tileSize = tmxTileMap->getTileSize();
  15. CCSize mapSize = tmxTileMap->getContentSize();
  16. mPlayerTank[0]->setPosition(ccp(mapSize.width / 2 - tileSize.width * 3, tileSize.height));
  17.  
  18. //添加虚拟手柄的显示
  19. mLayerPanel = Panel::create();
  20. addChild(mLayerPanel, 3);
  21.  
  22. return true;
  23. }

可以看到我们先初始化了地图信息,然后通过地图信息创建了一个坦克,并把坦克放到了地图中的初始化位置。

下面我们看看运行后的碰撞效果:

完整源码下载地址:

http://download.csdn.net/detail/yincheng01/6756657

cocos2d-x游戏开发系列教程-坦克大战游戏之坦克和地图碰撞的检测下的更多相关文章

  1. HTML5游戏开发系列教程6(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-6/ 这是我们最新一篇HTML5游戏开发系列文章.我们将继续使用c ...

  2. HTML5游戏开发系列教程7(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-7/ 今天我们将完成我们第一个完整的游戏--打砖块.这次教程中,将 ...

  3. HTML5游戏开发系列教程5(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...

  4. HTML5游戏开发系列教程4(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-4/ 这篇文章是我们继续使用canvas来进行HTML5游戏开发系 ...

  5. cocos2d-x游戏开发系列教程-坦克大战游戏启动界面的编写

    用前面介绍的方法,创建一个cocos2d-x项目,可以看到新项目内容如下图:

  6. cocos2d-x游戏开发系列教程-坦克大战游戏之敌方坦克AI的编写

    在上篇我们完成了子弹和地图碰撞的检测,在这篇我们将完成敌方坦克AI的编写. 具体思路是屏幕中保持有四个敌方坦克,然后坦克随机方向运动,并且子弹消失后1秒发射一次 1.我们新建一个敌方坦克的AI类来控制 ...

  7. cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞

    上篇文章实现了坦克与地图碰撞的检测, 这篇我们继续完成子弹和地图的碰撞检测. 1.先设计一个子弹类Bullet,如下所示: class Bullet : public CCSprite { publi ...

  8. HTML5游戏开发系列教程8(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-8/ 这是我们最新一篇HTML5游戏开发系列文章.我们将继续使用c ...

  9. HTML5游戏开发系列教程10(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-10/ 最后我们将继续使用canvas来进行HTML5游戏开发系列 ...

  10. HTML5游戏开发系列教程9(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-9/ 今天我们将继续使用canvas来进行HTML5游戏开发系列的 ...

随机推荐

  1. 安卓入门学习之Hello,world!

    第二章 Hello,world! 本文同时发表至简书,不为什么,用他的MarkDown在线编辑爽得要哭. 注意:本章节所使用的开发工具为Eclipse 以Android编程权威指南作为学习书物 第一节 ...

  2. linux: telnet

    问题: telnet: connect to address 192.168.1.103: Connection refused 总结:{ 1. 需要开启telnet服务, /etc/xinetd.d ...

  3. Java学习03

    Java学习03 1.java面试一些问题 一.什么是变量 变量是指在程序执行期间可变的数据.类中的变量是用来表示累的属性的,在编程过程中,可以对变量的值进行修改.变量通常是可变的,即值是变化的 二. ...

  4. Usaco 2.3 Zero Sums(回溯DFS)--暴搜

    Zero SumConsider the sequence of digits from 1 through N (where N=9) in increasing order: 1 2 3 ... ...

  5. Binary Tree Preorder Traversal and Binary Tree Postorder Traversal

    Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

  6. Laravel 5.1 ACL权限控制 一

    请自行添加命名空间,代码下载地址 https://github.com/caoxt/learngit 1.所需要用到的数据表 users(用户表).roles(角色表).role_user(用户角色对 ...

  7. 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取

    本文跟着上一篇文章继续写,上一篇文章的链接 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 一.随便说说 获取文件系统使用情况的思路和上一篇获取主要系统是 ...

  8. U-Boot在FL2440上移植(一)----修改系统时钟

    <一>U-boot源码结构 图片来自韦东山的<嵌入式linux应用开发完全手册> U-boot下载地址:ftp://ftp.denx.de/pub/u-boot/ 交叉编译工具 ...

  9. GCC -Wall

    官网:http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Warning-Options.html#Warning-Options3.8 Options to Re ...

  10. 简单的java缓存实现

    扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法 ...