cocos2d-x游戏开发系列教程-坦克大战游戏之坦克和地图碰撞的检测下
上篇我们完成了地图的信息获取和碰撞检测,这篇我们整合到程序中。
在这之前我们改造一下Tank类,使它更加模块化,共容易理解:
1.改造后的Tank类声明如下:
- class Tank : public CCSprite
- {
- public :
- Tank();
- ~Tank();
- static Tank* createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
- void initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
- void command(enumOrder order);
- TileMapInfo* mTileMapInfo;
- };
static Tank* createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
void initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
可以看到这两个函数后面都多了TileMapInfo类的指针。
我们可以在坦克中使用这个指针来检测是否碰撞。
2.我们实现void initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);
- void Tank::initTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo)
- {
- initWithSpriteFrameName(tankTypeName);
- mTileMapInfo = tileMapInfo;
- //将坦克放入地图层中
- mTileMapInfo->getTileMap()->addChild(this);
- //缩放到合适大小
- CCTMXTiledMap* tmxTileMap = mTileMapInfo->getTileMap();
- CCSize tileSize = tmxTileMap->getTileSize();
- CCSize tankSize = getContentSize();
- //比地图上砖块小一点
- setScale((tileSize.height * 2-4) / (tankSize.height));
- }
上面函数中,我们先把Tank类自己加入了地图层中,这样更方便我们进行一个位置计算。
然后缩放到了比地图上一整个砖块小一点的大小,这样可以正常通过砖块之间的通道。
3.简单的实现static Tank* createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo);来返回一个Tank实例:
- Tank* Tank::createTankWithTankType(const char* tankTypeName, TileMapInfo* tileMapInfo)
- {
- CCSpriteFrameCache* pCache = CCSpriteFrameCache::sharedSpriteFrameCache();
- pCache->addSpriteFramesWithFile("tank.plist");
- Tank* tank = new Tank();
- tank->initTankWithTankType(tankTypeName, tileMapInfo);
- tank->autorelease();
- return tank;
- }
可以看到我们添加了plist文件,然后从中加载了tankTypeName类型的Tank精灵,然后初始化,最后加入自动释放列表。
4.然后在void command(enumOrder order);函数中,我们在命令控制中加入检测碰撞的函数:
- bool Tank::command(enumOrder order)
- {
- float stepX = 0.0f;
- float stepY = 0.0f;
- float fRotation = getRotation();
- switch (order)
- {
- case cmdNothing:
- break;
- case cmdGoUP:
- stepY = 1.0f;
- fRotation = 0.0f;
- break;
- case cmdGoDown:
- stepY = -1.0f;
- fRotation = 180.0f;
- break;
- case cmdGoLeft:
- stepX = -1.0f;
- fRotation = 270.0f;
- break;
- case cmdGoRight:
- stepX = 1.0f;
- fRotation = 90.0f;
- break;
- case cmdFire:
- //调用子弹开火
- return mBullet->fire();
- default:
- break;
- }
- //根据运行方向旋转坦克
- setRotation(fRotation);
- //检测地图上的碰撞
- CCRect rect = this->boundingBox();
- if (!mTileMapInfo->collisionTest(CCRectMake(rect.getMinX() + stepX,
- rect.getMinY() + stepY, rect.size.width, rect.size.height)))
- {
- setPositionX(getPositionX() + stepX);
- setPositionY(getPositionY() + stepY);
- return true;
- }
- return false;
- }
可以看到我们跟之前的Tank类的command函数中多了碰撞检测,
先通过boundingBox获取Tank在地图中的矩形,然后传入移动后的矩形,
通过TileMapInfo类中的collisionTest碰撞函数,来检测是否碰撞,
如果碰撞则不移动,如果没有碰撞则按照stepX和stepY分量进行移动位置。
5.Tank类改造完了,最后我们需要在CityScene中初始化我们的新 TileMapInfo类和Tank类:
- bool CityScene::init()
- {
- CCLayer::init();
- //初始化地图信息
- TileMapInfo* tileMapInfo = TileMapInfo::createMapInfoWithFile("Round1.tmx");
- CCTMXTiledMap* tmxTileMap = tileMapInfo->getTileMap();
- this->addChild(tmxTileMap);
- //在已有的地图上,创建玩家坦克
- mPlayerTank[0] = Tank::createTankWithTankType("player2U.png", tileMapInfo);
- //放到地图中初始化位置
- CCSize tileSize = tmxTileMap->getTileSize();
- CCSize mapSize = tmxTileMap->getContentSize();
- mPlayerTank[0]->setPosition(ccp(mapSize.width / 2 - tileSize.width * 3, tileSize.height));
- //添加虚拟手柄的显示
- mLayerPanel = Panel::create();
- addChild(mLayerPanel, 3);
- return true;
- }
可以看到我们先初始化了地图信息,然后通过地图信息创建了一个坦克,并把坦克放到了地图中的初始化位置。
下面我们看看运行后的碰撞效果:
完整源码下载地址:
http://download.csdn.net/detail/yincheng01/6756657
cocos2d-x游戏开发系列教程-坦克大战游戏之坦克和地图碰撞的检测下的更多相关文章
- HTML5游戏开发系列教程6(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-6/ 这是我们最新一篇HTML5游戏开发系列文章.我们将继续使用c ...
- HTML5游戏开发系列教程7(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-7/ 今天我们将完成我们第一个完整的游戏--打砖块.这次教程中,将 ...
- HTML5游戏开发系列教程5(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...
- HTML5游戏开发系列教程4(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-4/ 这篇文章是我们继续使用canvas来进行HTML5游戏开发系 ...
- cocos2d-x游戏开发系列教程-坦克大战游戏启动界面的编写
用前面介绍的方法,创建一个cocos2d-x项目,可以看到新项目内容如下图:
- cocos2d-x游戏开发系列教程-坦克大战游戏之敌方坦克AI的编写
在上篇我们完成了子弹和地图碰撞的检测,在这篇我们将完成敌方坦克AI的编写. 具体思路是屏幕中保持有四个敌方坦克,然后坦克随机方向运动,并且子弹消失后1秒发射一次 1.我们新建一个敌方坦克的AI类来控制 ...
- cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞
上篇文章实现了坦克与地图碰撞的检测, 这篇我们继续完成子弹和地图的碰撞检测. 1.先设计一个子弹类Bullet,如下所示: class Bullet : public CCSprite { publi ...
- HTML5游戏开发系列教程8(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-8/ 这是我们最新一篇HTML5游戏开发系列文章.我们将继续使用c ...
- HTML5游戏开发系列教程10(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-10/ 最后我们将继续使用canvas来进行HTML5游戏开发系列 ...
- HTML5游戏开发系列教程9(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-9/ 今天我们将继续使用canvas来进行HTML5游戏开发系列的 ...
随机推荐
- 安卓入门学习之Hello,world!
第二章 Hello,world! 本文同时发表至简书,不为什么,用他的MarkDown在线编辑爽得要哭. 注意:本章节所使用的开发工具为Eclipse 以Android编程权威指南作为学习书物 第一节 ...
- linux: telnet
问题: telnet: connect to address 192.168.1.103: Connection refused 总结:{ 1. 需要开启telnet服务, /etc/xinetd.d ...
- Java学习03
Java学习03 1.java面试一些问题 一.什么是变量 变量是指在程序执行期间可变的数据.类中的变量是用来表示累的属性的,在编程过程中,可以对变量的值进行修改.变量通常是可变的,即值是变化的 二. ...
- 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 ... ...
- 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 ...
- Laravel 5.1 ACL权限控制 一
请自行添加命名空间,代码下载地址 https://github.com/caoxt/learngit 1.所需要用到的数据表 users(用户表).roles(角色表).role_user(用户角色对 ...
- 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取
本文跟着上一篇文章继续写,上一篇文章的链接 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 一.随便说说 获取文件系统使用情况的思路和上一篇获取主要系统是 ...
- U-Boot在FL2440上移植(一)----修改系统时钟
<一>U-boot源码结构 图片来自韦东山的<嵌入式linux应用开发完全手册> U-boot下载地址:ftp://ftp.denx.de/pub/u-boot/ 交叉编译工具 ...
- GCC -Wall
官网:http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Warning-Options.html#Warning-Options3.8 Options to Re ...
- 简单的java缓存实现
扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法 ...