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 判断是否 ie6 ie7 ie8
var isIE = !!window.ActiveXObject; var isIE6 = isIE && !window.XMLHttpRequest; var isIE8 = ...
- eclipse中配置c++开发环境 Eclipse + CDT + MinGW
转自eclipse中配置c++开发环境 Eclipse + CDT + MinGW 基本框架:Eclipse + CDT + MinGW 背景知识: CDT:CDT 是完全用 Java 实现的开放源码 ...
- Axzue注册码
ahjesus Axure RP 7.0注册码 用户名:axureuser 序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6IyPD6lK7G6+t ...
- 李洪强漫谈iOS开发[C语言-027]-自增与自减运算符
- VS2013 ASP.NET MVC 修改Web项目的IISExpress的端口固定
[首先]关闭防火墙,或防火墙开放端口 在解决方案中,右键某项目,属性——Web——服务器——选择IISExpress URL输入:http://localhost:8000/ 直接将8000更改 ...
- asp.net中bin目录下的 dll.refresh文件
首先找到了这篇文章http://www.cnblogs.com/haokaibo/archive/2010/07/31/1789342.html 然后找到一篇英文的文章http://monsur.xa ...
- 灰度图像--图像增强 直方图均衡化(Histogram equalization)
灰度图像--图像增强 直方图均衡化(Histogram equalization) 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些 ...
- linux 下 epoll 编程
转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...
- BZOJ2105: 增强型LCP
2105: 增强型LCP Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 366 Solved: 86[Submit][Status] Descrip ...
- ☀【组件】getRequest
→ GitHub <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...