在此場景中,我們假設有很多敵人和子彈,其中子彈可以擊中敵人,並且碰撞後子彈和敵人都會隨之消失。
首先,我們需要去追蹤這些敵人和子彈。
我們可以為這兩種物體新增tag,在這裡我們給敵人新增tag=1,給子彈新增tag=2,。因為ccsprite繼承自ccnode,因為已經有了settag和gettag方法;我們可以通過這種方式來區分不同的精靈。
新增兩個成員物件在helloworldscene.h中。用來分別儲存存在的敵人和子彈。
[cpp]view plain
copy
protected
: cocos2d::ccarray *_targets;
cocos2d::ccarray *_projectiles;
在cocos2dx中,在建構函式中初始化這兩個變數,在init()函式中new,在析構函式中release。
[cpp]view plain
copy
// 初始化
_targets = new
ccarray;
_projectiles = new
ccarray;
helloworld::~helloworld()
if(_projectiles)
// cpp不需要呼叫super釋放,虛析構函式將會做這些事
} helloworld::helloworld()
:_targets(null)
,_projectiles(null)
現在更改addtarget()來新增乙個新的敵人到targets陣列中,並且把它的tag設定為1.
[cpp]view plain
copy
// 新增到陣列中
target->settag(1);
_targets->addobject(target);
更改一下cctouchesended()來新增乙個新的子彈到bullets陣列中,並且設定它的tag為2.
[cpp]view plain
copy
// 新增到_projectiles陣列中
projectile->settag(2);
_projectiles->addobject(projectile);
接下來,更改如下的spritemovefinished()函式。這裡我們將從相應的陣列中移除一些精靈。
[cpp]view plain
copy
void
helloworld::spritemovefinished(ccnode* sender)
else
if(sprite->gettag() == 2)
// projectile
}
下面的函式update()將會每幀被執行到一次,一般用來檢測碰撞檢測,可以移除掉碰撞的子彈和敵人。
在helloworldscene.h中宣告它,在helloworldscene.cpp.定義它。
[cpp]view plain
copy
void
helloworld::update(
float
dt)
} } ccarray_foreach(targetstodelete, jt)
ccarray_foreach(projectilestodelete, it)
projectilestodelete->release();
targetstodelete->release();
好了,最後的事情我們將要做的就是新增update()到計時器中,來讓它每幀被呼叫一次,一般在onenter()函式中新增此行**。
[cpp]view plain
copy
void
helloworld::onenter()
乙個簡單的碰撞檢測模型就建立好啦~
cocos2dx基礎篇 23 簡單碰撞檢測
嘮叨 本節來講講簡單的物理碰撞檢測 非box2d物理碰撞 矩形 圓之間的碰撞檢測。3.x 將數學類ccpoint ccrect改為v3.x版本的vec2 rect就好了。簡單碰撞檢測 在一些遊戲中經常會遇到碰撞檢測的情況,如憤怒的小鳥飛出去後,是否與石頭發生碰撞。雖然說有乙個box2d物理碰撞引擎,...
cocos2d x如何檢測碰撞
我們的英雄現在可以發射子彈了,但僅僅只是裝飾而已,如何才能殺掉怪物呢?在這一章,我們將介紹碰撞檢測來實現這一效果。首先,跟蹤怪物和子彈是必需的。在遊戲中,我們為這兩種精靈加以不同的tag來區分它們。當tag 1時,表示這是怪物,而tag 2時,則表示這為子彈。由於在ccnode裡面有m ntag這個...
Cocos2d x3 2中 碰撞檢測的實現
cocos2d x中實現簡單碰撞檢測的有rect包圍盒工具,用起來十分便捷。先看 子彈與敵機的碰撞 for int i 0 ipx,nowbullet py 100,nowbullet sp getcontentsize width,nowbullet sp getcontentsize heigh...