很快大家就會發現,射出的子彈和敵機都是「擦肩而過」,毫無威力,這顯然不合邏輯。這裡我們介紹cocos2d裡常用的碰撞檢測方法,用於檢測遊戲物件之間的碰撞。雖然這種碰撞比較簡單,檢測精度也不是很高,但是對於一般遊戲來說已經足夠了。
在介紹實際的碰撞檢測方法之前,我們需要乙個輔助方法,根據精靈當前的位置算出它的「可碰撞區域」,如**清單2-24所示。
**清單2-24 輔助方法的實現
-(cgrect) rectofsprite:(ccsprite*)sprite
此方法根據精靈所在位置和精靈的實際大小計算出乙個矩形區域代表精靈的可碰撞區域。
具體的碰撞檢測**如**清單2-25所示。
**清單2-25 碰撞檢測
-(void) collisiondetection:(cctime)dt
& player collision detection
ccsprite *playersprite = (ccsprite*)[self getchildbytag:ktagpalyer];
cgrectplayrect = [self rectofsprite:playersprite];
if (playersprite.visible&&
playersprite.numberofrunningactions == 0
&&cgrectintersectsrect(enemyrect, playrect)) }}
}
在這個遊戲中我們只需要關心子彈與敵機的碰撞、敵機與玩家飛機的碰撞就行了。因此,首先我們計算出子彈的碰撞區域,遍歷所有的敵機,逐個判斷敵機與子彈以及敵機與玩家飛機之間的碰撞。
注意 這裡用cgrectintersectsrect方法檢測碰撞,此方法判斷兩個矩形是否相交。如果形狀不規則,或者原始精靈的透明畫素過多,這種檢測方法就會非常不準確。後面學習物理引擎時,我們將介紹一種更加精確的碰撞檢測方法。
這裡需要注意兩點:
檢測物件必須在螢幕可見範圍之內;
檢測到碰撞以後需要停止action,再做相應的碰撞處理邏輯,比如讓敵機消失、計分之類。
當然,由於此處敵機採用復用的方式,擊中以後並不是刪除這個物件,而只是把可見性設定為no,然後放回陣列裡,下次又可從裡面再取出來,再次向玩家發起進攻。
編譯並執行,體驗殺死敵機的快感吧!
cocos2d實現語音 Cocos2d 聲音API
param url 聲音路徑 cc.audioengine.playmusic url loop 停止背景 param releasedata 是否釋放聲音資料,預設為false cc.audioengine.stopmusic releasedata 暫停背景 cc.audioengine.pau...
cocos2d滑動碰撞檢測的實現
最近在做乙個類似切水果的小遊戲,需要檢測手在螢幕上是否劃到了園形的精靈。對於圓形的碰撞檢測還是很容易的 當觸點到圓心的距離小於等於圓的半徑時,結果為真。void mgame cctouchmoved cctouch ptouch,ccevent pevent 當觸點到圓心的距離小於等於圓的半徑時,結...
cocos2d碰撞問題(下) 亂碼的解決
在原來程式中加這串 亂碼問題處理 利用ccdictionary來讀取xml ccdictionary strings ccdictionary createwithcontentsoffile luanma.xml 讀取hello鍵中的值 objectforkey根據key,獲取對應的string ...