Chapter 5 - How to Detect the Collisions
Chapter 5 - How to Detect the Collisions
Our hero can fire bullets now, but the bullets are only visual. So how can they kill their enemies?
In this chapter, we will introduce Collision Detection to implement it.
Firstly, it’s necessary to track the enemies and the bullets.
In the game, we add a tag for these two kinds of sprites to identify them. Let tag = 1 if the sprite is an enemy, and tag = 2 mean it is a bullet. Because CCSprite inherits from CCNode, there is already a member variable m_nTag with methods setTag() and getTag(); we can implement this to identify the different types of sprites.
Add the two member variables below to HelloWorld in HelloWorldScene.h. These are used to store the existing enemies and bullets.
1// cpp with cocos2d-x
2protected:
3 cocos2d::CCArray *_targets;
4 cocos2d::CCArray *_projectiles;
In cocos2d-x, CCMutableArray is an implementation of NSMutableArray in iOS which contains NSObject's and their subclasses. Something different is that you should specify the concrete category of its members.
Then initialize the two variables in the construct function, new them in init(), and release them in the destruct function.
1// cpp with cocos2d-x
2
3// in init()
4// Initialize arrays
5_targets = new CCArray;
6_projectiles = new CCArray;
7
8HelloWorld::~HelloWorld()
9{
10 if (_targets)
11 {
12 _targets->release();
13 _targets = NULL;
14 }
15
16 if (_projectiles)
17 {
18 _projectiles->release();
19 _projectiles = NULL;
20 }
21
22 // cpp don't need to call super dealloc
23 // virtual destructor will do this
24}
25
26HelloWorld::HelloWorld()
27:_targets(NULL)
28,_projectiles(NULL)
29{
30}
Now modify addTarget() to add a new target to targets array, and set its tag to be 1.
1// cpp with cocos2d-x
2// Add to targets array
3target->setTag(1);
4_targets->addObject(target);
Modify ccTouchesEnded() to add a new bullet to bullets array, and set its tag to be 2.
1// cpp with cocos2d-x
2// Add to projectiles array
3projectile->setTag(2);
4_projectiles->addObject(projectile);
Then, modify spriteMoveFinished() as follows. Here we remove the sprites from their corresponding arrays.
1// cpp with cocos2d-x
2void HelloWorld::spriteMoveFinished(CCNode* sender)
3{
4 CCSprite *sprite = (CCSprite *)sender;
5 this->removeChild(sprite, true);
6
7 if (sprite->getTag() == 1) // target
8 {
9 _targets->removeObject(sprite);
10 }
11 else if (sprite->getTag() == 2) // projectile
12 {
13 _projectiles->removeObject(sprite);
14 }
15}
The function update() below is used to detect collisions every frame, remove the collided bullet and enemy from the scene.
Declare it in HelloWorldScene.h and Define it in HelloWorldScene.cpp.
1// cpp with cocos2d-x
2void HelloWorld::update(float dt)
3{
4 CCArray *projectilesToDelete = new CCArray;
5 CCArray* targetsToDelete =new CCArray;
6 CCObject* it = NULL;
7 CCObject* jt = NULL;
8
9 CCARRAY_FOREACH(_bullet, it)
10 {
11 CCSprite *projectile = dynamic_cast<CCSprite*>(it);
12 CCRect projectileRect = CCRectMake(
13 projectile->getPosition().x - (projectile->getContentSize().width/2),
14 projectile->getPosition().y - (projectile->getContentSize().height/2),
15 projectile->getContentSize().width,
16 projectile->getContentSize().height);
17
18 CCARRAY_FOREACH(_target, jt)
19 {
20 CCSprite *target = dynamic_cast<CCSprite*>(jt);
21 CCRect targetRect = CCRectMake(
22 target->getPosition().x - (target->getContentSize().width/2),
23 target->getPosition().y - (target->getContentSize().height/2),
24 target->getContentSize().width,
25 target->getContentSize().height);
26
27 if (projectileRect.intersectsRect(targetRect))
28 {
29 targetsToDelete->addObject(target);
30 projectilesToDelete->addObject(projectile);
31 }
32 }
33 }
34
35 CCARRAY_FOREACH(targetsToDelete, jt)
36 {
37 CCSprite *target = dynamic_cast<CCSprite*>(jt);
38 _target->removeObject(target);
39 this->removeChild(target, true);
40 }
41
42 CCARRAY_FOREACH(projectilesToDelete, it)
43 {
44 CCSprite* projectile = dynamic_cast<CCSprite*>(it);
45 _bullet->removeObject(projectile);
46 this->removeChild(projectile, true);
47 }
48
49 projectilesToDelete->release();
50 targetsToDelete->release();
51}
Ok, the last thing we should do is adding update() to the schedule to let it be called every frame.
1// cpp with cocos2d-x
2this->schedule( schedule_selector(HelloWorld::update) );
Compile and run the project, fire the bullets as you like, then: AH..AH.., the enemies are killed one by one.
Chapter 5 - How to Detect the Collisions的更多相关文章
- js实现四叉树算法
最近在看canvas动画方面教程,里面提到了采用四叉树检测碰撞.之前也看到过四叉树这个名词,但是一直不是很懂.于是就又找了一些四叉树方面的资料看了看,做个笔记,就算日后忘了,也可以回来看看. Quad ...
- [译]2D空间中使用四叉树Quadtree进行碰撞检测优化
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.2.0f3 原文出处 : Quick Tip: Use Quadtrees to Detect Lik ...
- [转]第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV
仅供参考,还未运行程序,理解部分有误,请参考英文原版. 绿色部分非文章内容,是个人理解. 转载请注明:http://blog.csdn.net/raby_gyl/article/details/174 ...
- JavaScript- The Good Parts CHAPTER 2
I know it well:I read it in the grammar long ago.—William Shakespeare, The Tragedy(悲剧:灾难:惨案) of Titu ...
- JavaScript- The Good Parts Chapter 6
Thee(你) I’ll chase(追逐:追捕) hence(因此:今后), thou(你:尔,汝) wolf in sheep’s array.—William Shakespeare, The ...
- JavaScript- The Good Parts Chapter 4
Why, every fault’s condemn’d ere it be done:Mine were the very cipher of a function. . .—William Sha ...
- MongoDB:The Definitive Guide CHAPTER 2 Getting Started
MongoDB is very powerful, but it is still easy to get started with. In this chapter we’ll introduce ...
- Notes : <Hands-on ML with Sklearn & TF> Chapter 1
<Hands-on ML with Sklearn & TF> Chapter 1 what is ml from experience E with respect to som ...
- JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
Chapter 3. Compiling for the Java Virtual Machine 内容列表 3.1. Format of Examples 3.2. Use of Constants ...
随机推荐
- JQuery为元素添加样式
由于jquery支持css3,所有能很好的兼容很多浏览器,所以通过jquery来使用css样式比较好 为定义好的css样式可以调用元素的css方法添加样式 $("span").cs ...
- BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐
Description The cows are having a picnic! Each of Farmer John's K (1 <= K <= 100) cows is graz ...
- BZOJ 1629: [Usaco2007 Demo]Cow Acrobats
Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...
- 玩转createjs
标题党"玩转", 真的是在玩怎么转... 参考一篇很经典的博文:createjs入门 做移动版(750x1334)的时候出来不居中啊, 不是掉在下面就是滑到右面, canvas里面 ...
- 【 CodeForces - 392C】 Yet Another Number Sequence (二项式展开+矩阵加速)
Yet Another Number Sequence Description Everyone knows what the Fibonacci sequence is. This sequence ...
- 李洪强iOS开发Swift篇—07_函数
李洪强iOS开发Swift篇—07_函数 一.函数的定义 (1)函数的定义格式 1 func 函数名(形参列表) -> 返回值类型 { 2 // 函数体... 3 4 } (2)形参列表的格式 ...
- Android软件开发之发送短信与系统短信库解析
今天我和同学们讨论一下Android平台下如何调用系统方法发送短信.接收短信.系统的短信库相关的问题.进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信.在Eclipse下打开DDM ...
- perl unload utf-8 oracle 数据库
perl unload utf-8 Oracle [oracle@oadb sbin]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Produc ...
- 【HDOJ】2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
多重背包. #include <stdio.h> #include <string.h> ]; int n, m; void completePac(int p, int h) ...
- How to: Use a Custom User Name and Password Validator
在wcf中使用自定义的用户名和密码验证方式 https://msdn.microsoft.com/en-us/library/aa702565.aspx http://www.codeproject. ...