cocos2d x如何檢測碰撞

2021-06-11 06:21:05 字數 3516 閱讀 5860

我們的英雄現在可以發射子彈了,但僅僅只是裝飾而已,如何才能殺掉怪物呢?在這一章,我們將介紹碰撞檢測來實現這一效果。

首先,跟蹤怪物和子彈是必需的。

在遊戲中,我們為這兩種精靈加以不同的tag來區分它們。當tag=1時,表示這是怪物,而tag=2時,則表示這為子彈。由於在ccnode裡面有m_ntag這個成員變數,並且有settag和gettag方法,因此ccsprite就繼承了這些方法,我們可以利用之。

在helloworldscene.h中,把以下兩個成員變數加入到helloworld下,這兩個成員變數用於快取現有的怪物和子彈。

1// cpp with cocos2d-x

2protected:

3 cocos2d::ccmutablearray *_targets;

4 cocos2d::ccmutablearray *_projectiles;

1// objc with cocos2d-iphone

2 nsmutablearray *_targets;

3 nsmutablearray *_projectiles;

在cocos2d-x裡,ccmutablearray相當於ios sdk中的nsmutablearray,該陣列裡的成員可以是nsobject或者他們的子類。但不同的是,你必須告訴它裡面要放的是哪種具體的型別。

之後建構函式中初始化這兩個變數,在init()中new 它們,並在析構函式中release 它們。

1// cpp with cocos2d-x

3// in init()

4// initialize arrays

5_targets = new ccmutablearray;

6_projectiles = new ccmutablearray;

8helloworld::~helloworld()

916 if (_projectiles)

17 22 // cpp don't need to call super dealloc

23 // virtual destructor will do this

24}26helloworld::helloworld()

27:_targets(null)

28,_projectiles(null)

291// objc with cocos2d-iphone

2// in init()

3// initialize arrays

4_targets = [[nsmutablearray alloc] init];

5_projectiles = [[nsmutablearray alloc] init];

7- (void) dealloc

8現在可以修改addtarget(),把新目標新增到目標陣列中,並設定其tag為1。

1// cpp with cocos2d-x

2// add to targets array

3target->settag(1);

4_targets->addobject(target);

1// objc with cocos2d-iphone

2// add to targets array

3target.tag = 1;

4[_targets addobject:target];

修改cctouchesended(),把新子彈加入到子彈陣列中,並設定其tag為2。

1// cpp with cocos2d-x

2// add to projectiles array

3projectile->settag(2);

4_projectiles->addobject(projectile);

1// objc with cocos2d-iphone

2// add to projectiles array

3projectile.tag = 2;

4[_projectiles addobject: projectile];

之後,按下面修改spritemovefinished()。這裡根據標記的不同,在對應的陣列中移除精靈

1// cpp with cocos2d-x

2void helloworld::spritemovefinished(ccnode* sender)

311 else if (sprite->gettag() == 2) // projectile

12 15}

1// objc with cocos2d-iphone

2-(void)spritemovefinished:(id)sender

311 else if (sprite.tag == 2) // projectile

12 15}

下面的update()函式用於檢測每幀的碰撞,並從遊戲中刪除碰撞中的子彈和怪物。

請在helloworldscene.h中宣告,在helloworldscene.cpp中定義。

1// cpp with cocos2d-x

2void helloworld::update(cctime dt)

335 }

37 for (jt = targetstodelete->begin();

38 jt != targetstodelete->end();

39 jt++)

40 46 if (targetstodelete->count() >0)

47 50 targetstodelete->release();

51 }

53 for (it = projectilestodelete->begin();

54 it != projectilestodelete->end();

55 it++)

56 61 projectilestodelete->release();

62}1// objc with cocos2d-iphone

2- (void)update:(cctime)dt

332 }

34 for (ccsprite *target in targetstodelete)

35 41 if (targetstodelete.count >0)

42 45 [targetstodelete release];

46 }

48 for (ccsprite *projectile in projectilestodelete)

49 54 [projectilestodelete release];

55}好了,最後一件事,我們要把update()加入到schedule裡讓它每幀都能被呼叫。

1// cpp with cocos2d-x

2this->schedule( schedule_selector(helloworld::update) );

1// objc with cocos2d-iphone

2[self schedule:@selector(update:)];

編譯並執行專案,盡情地發射子彈吧,這時:啊哈,怪物都乙個接著乙個地被乾掉了。

cocos2dx碰撞檢測實現

在此場景中,我們假設有很多敵人和子彈,其中子彈可以擊中敵人,並且碰撞後子彈和敵人都會隨之消失。首先,我們需要去追蹤這些敵人和子彈。我們可以為這兩種物體新增tag,在這裡我們給敵人新增tag 1,給子彈新增tag 2,因為ccsprite繼承自ccnode,因為已經有了settag和gettag方法 ...

cocos2dx基礎篇 23 簡單碰撞檢測

嘮叨 本節來講講簡單的物理碰撞檢測 非box2d物理碰撞 矩形 圓之間的碰撞檢測。3.x 將數學類ccpoint ccrect改為v3.x版本的vec2 rect就好了。簡單碰撞檢測 在一些遊戲中經常會遇到碰撞檢測的情況,如憤怒的小鳥飛出去後,是否與石頭發生碰撞。雖然說有乙個box2d物理碰撞引擎,...

Cocos2d x遊戲的效能檢測

貼一篇舊文,如果以後有更多有趣的經驗會更到原部落格上 前段時間本渣負責了一些優化我們cocos2d x遊戲效能方面的工作,在這裡做一點記錄。在debug版的cocos2d x遊戲裡,通常會在左下角顯示三個指標 當然,是否顯示這三個指標是可以配置的 可千萬別小看了這三個不起眼的指標,對從它們入手進行分...