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的更多相关文章

  1. js实现四叉树算法

    最近在看canvas动画方面教程,里面提到了采用四叉树检测碰撞.之前也看到过四叉树这个名词,但是一直不是很懂.于是就又找了一些四叉树方面的资料看了看,做个笔记,就算日后忘了,也可以回来看看. Quad ...

  2. [译]2D空间中使用四叉树Quadtree进行碰撞检测优化

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.2.0f3 原文出处 : Quick Tip: Use Quadtrees to Detect Lik ...

  3. [转]第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV

    仅供参考,还未运行程序,理解部分有误,请参考英文原版. 绿色部分非文章内容,是个人理解. 转载请注明:http://blog.csdn.net/raby_gyl/article/details/174 ...

  4. JavaScript- The Good Parts CHAPTER 2

    I know it well:I read it in the grammar long ago.—William Shakespeare, The Tragedy(悲剧:灾难:惨案) of Titu ...

  5. JavaScript- The Good Parts Chapter 6

    Thee(你) I’ll chase(追逐:追捕) hence(因此:今后), thou(你:尔,汝) wolf in sheep’s array.—William Shakespeare, The ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. DataGrid点击上下一页loading效果

    js添加显示loading和取消loading方法 function showtbloading() { var target = $("#GridView1"); if (tar ...

  2. log.isDebugEnabled()的使用

    转自: http://huangxx.iteye.com/blog/190693 在使用log4j,common-log这样的log框架时,发现很多代码中这样写 if   (log.isDebugEn ...

  3. ANDROID_MARS学习笔记_S04_006_用获取access_token,access_token_secrect

    一.代码流程 1.MainActivity会开启PrepareRequestTokenActivity 2.PrepareRequestTokenActivity会根据配置文件的CONSUMER_KE ...

  4. ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  5. Android UI 设计准则

    Design Principles  设计准则 These design principles were developed by and for the Android User Experienc ...

  6. PEP Index > PEP 339 -- Design of the CPython Compiler 译文

    http://www.python.org/dev/peps/pep-0339/ PEP: 339 标题: CPython的编译器设计 版本: 425fc5598ee8 最后修改: 2011-01-1 ...

  7. reviewboard搭建

    reviewboard的搭建 系统:fedora 19 内核版本:3.9.5-301.fc19.x86_64 步骤 命令 备注 安装mysql # yum -y install mysql mysql ...

  8. 【HDOJ】2157 How many ways??

    矩阵乘法,用DP做各种wa,后来发现原因了. #include <stdio.h> #include <string.h> typedef struct { ][]; } ma ...

  9. linux上TCP connection timeout的原因查找

    linux上TCP connection timeout的原因查找 好久没有写文章了, 今天解决了一个网络连接超时的问题, 记录以备查看. 最近在线上nginx经常出现输出connection tim ...

  10. 在windows下解压缩Linux内核源代码出现重复文件原因

    在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂     原因一.因为在Lin ...