本站文章均為 李華明Himi 原創,轉載務必在明顯處註明:

轉載自【黑米GameDev街區】 原文連結: http://www.himigame.com/iphone-cocos2d/450.html 

最近幾天一直在啃cocos2d,消化了不少東西,基本可以有些把握下手寫公司的遊戲了;那麼今天就把一些重點的拿出來分享下經驗,給新童鞋們作為參考;

這篇就來詳細介紹下cocos2d對使用者觸屏的監聽事件進行下分析(cocos2d有很多詳細的文章和教程,我這裡只是出於自己的理解來說)

進入正題:從整體cocos2d對觸屏的事件監聽可以分為兩種:

1.單一監聽,所謂單一監聽其實是跟cocos2d引擎框架有關,因為在cocos2d中每個遊戲介面都可以使用一個CCLayout完成,那麼當一個CCLayout在螢幕顯示出來後,想要監聽使用者的按鍵事件,一般都會使用以下形式來進行監聽:(注意:這裡是CCLayout類進行監聽的方式)

首先開啟監聽:

 

  1. self.isTouchEnabled=YES;  

然後重寫監聽函式即可:

 

  1. //監聽首次觸發事件   
  2. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event   
  3. {   
  4. }   
  5. //觸控事件 - 當手指在螢幕上進行移動   
  6. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event   
  7. {   
  8.        
  9. }   
  10. //觸控事件 - 當手指從螢幕抬起時呼叫的方法   
  11. -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event   
  12. {   
  13.            
  14. }   

此種監聽狠eazy,但是要注意這裡是對CCLayout類進行的監聽方式;

 

2.監聽分發; 剛才說了,遊戲的每個介面可能都是一個CCLayout,但是如果我想讓一個CCSprite精靈主角單獨進行監聽,或者說在CCLayout有很多個精靈我想單獨監聽其中的一種的時候,這時候就需要使用監聽分發的形式了;

假設我們自定義了一個類XX繼承CCSprite,還有一個YY類也繼承CCSprite,而且XX型別與YY類的例項都存在於一個Layout上,那麼我想對XX與YY型別分別單獨監聽的話;首先我們先讓當前繼承的CCSprite類的XX於YY類都使用 <CCTargetedTouchDelegate>協議;

(CCSprite中沒有 self.isTouchEnabled=YES; 這個函式,別直接寫這個哦~)

程式碼如下:

 

 

  1. @interface XX : CCSprite <CCTargetedTouchDelegate>{   
  2.    
  3. }   

然後在當前實現類中重寫一個函式如下:

 

  1. -(void) registerWithTouchDispatcher   
  2. {   
  3.     [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];   
  4. }   

(此函式是註冊監聽,如果裡面什麼都不寫,則當前不會相應任何觸屏事件;)

 

重寫觸控的各事件函式,如下:

 

  1. //監聽首次觸發事件   
  2. - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event   
  3. {    
  4.     return NO;   
  5. }   
  6. //監聽移動事件   
  7. - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event   
  8. {      
  9. }   
  10. //監聽離開事件   
  11. - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event   
  12. {   
  13.        
  14. }  

 

 

  1. //使用[CCDirector replaceScene:XX],替換場景時,會呼叫以下3個方法   
  2. //呼叫順序依次為:   
  3. //1.othterScene的+(id)Scene——>   
  4. //2.otherScene的init——>   
  5. //3.otherScene的onEnter——>   
  6. //4.執行過渡效果   
  7. //5.當前Scene的onExit函式——>   
  8. //6.otherLayout的onEnterTransitionDidFinish()   
  9. //7.當前Scene的dealoc函式   
  10. -(void) onEnter{   
  11.     //呼叫其他Scene的init方法以後會呼叫此方法   
  12.     //如果使用了CCTransitionScene,本方法將在過渡效果開始後呼叫   
  13.     //(如果不呼叫super onEnter新場景可能對觸控和加速計無發應)   
  14.     [super onEnter];   
  15. }   
  16. -(void) onEnterTransitionDidFinish{   
  17.     //呼叫onEnter後會呼叫此函式   
  18.     //如果使用了CCTransitionScene,將會在過渡效果完成時呼叫此方法   
  19.     [super onEnterTransitionDidFinish];   
  20. }   
  21. -(void)onExit{    
  22.     //在呼叫dealloc之前會呼叫此函式;   
  23.     //如果使用了CCTransitionScene,將會在過渡效果結束以後呼叫此方法   
  24.     //(如果不呼叫super onExit,當前場景可能不會從記憶體中釋放)   
  25.     [super onExit];   
  26. }   

大家可以看到,此種監聽方式除了各種監聽函式與第一種類似之外,在 ccTouchBegan的函式有個返回型別-布林值;那麼其作用下面詳細介紹;如果XX與YY類都實現了第二種監聽方式的話,那麼當使用者觸屏後,(當前使用者觸發的是XX與YY類例項所在的CCLayout)首先會進入XX或者YY的其中的ccTouchBegan函式中,這裡假設首先進入了XX類中,那麼XX類中的ccTouchBegan將會被響應,如果return true;表示不再將使用者觸屏的訊息傳遞給YY類中進行響應,也就是說不再響應YY類中的ccTouchBegan函式,那麼如果 return false;則會將當前觸屏資訊傳遞給其他註冊過的型別中;

一句話概括:return 的值,如果是真則表明使用者觸控事件已經被處理,其他不會再去進行監聽;如果為假,則會繼續交給其他註冊過的型別中進行處理;

 

那麼第二種監聽的方式比較常用,這樣便於處理,那麼至於註冊,一般都是放在 onEnter函式中;onEnter函式是每個CCScene之間切換會被響應的函式,相當於是CCScene的生命週期函式,具體呼叫順序如下: