我們的英雄現在可以發射子彈了,但僅僅只是裝飾而已,如何才能殺掉怪物呢?在這一章,我們將介紹碰撞檢測來實現這一效果。
首先,跟蹤怪物和子彈是必需的。
在遊戲中,我們為這兩種精靈加以不同的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遊戲裡,通常會在左下角顯示三個指標 當然,是否顯示這三個指標是可以配置的 可千萬別小看了這三個不起眼的指標,對從它們入手進行分...