本站文章均為 李華明Himi 原創,轉載務必在明顯處註明:
轉載自【黑米GameDev街區】 原文連結: http://www.himigame.com/iphone-cocos2d/453.html

 上一章節中介紹了,如何利用兩種方式對使用者觸屏進行監聽,那麼今天要重點講解一個問題;

要講的問題主要是在使用註冊監聽(事件分配方式監聽觸屏)中的問題,上一章節中說過,此種方式首先要註冊:如下程式碼:

 

  1. //註冊獨立觸控事件  
  2. [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];  

 

那麼如果多個註冊監聽的話,可以根據優先順序(priority)引數進行設定,此引數的值越大,優先順序越低,假設有XX與YY註冊了監聽,如果XX優先順序>YY, 那麼首先會進入XX的監聽函式;

使用上面的方式進行監聽的話,會進行監聽以下這幾個事件:

 

  1. – (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event  
  2. {  
  3.     return NO;  
  4. }  
  5.   
  6. – (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event  
  7. {     
  8. }  
  9.   
  10. – (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event  
  11. {  
  12.   
  13. }  

 

如果XX中的ccTouchBegan函式中返回Yes的話,就不會響應其他監聽的(YY)中重寫的監聽函式;這個上一章節中介紹過;但是要說的也正是這裡,如果你想要XX與YY都監聽事件,那麼兩個都可以在ccTouchBegan中返回NO,但是如果你想在處理YY或者XX中的ccTouchMoved移動事件函式中的話,你會發現XX與YY都不會響應其函式,原因是,當你retrun NO;的時候雖然執行了ccTouchBegan與return之間的程式碼,但是你return NO其實就是告訴cocos2d放棄此次事件處理,讓cocos2d繼續將觸屏事件分配給其他註冊過的類去處理監聽,直到結束或者cocos2d獲取到return true為止;

那麼解決的方案:比如你想監聽YY類中的ccTouchMoved事件,那麼為了不影響XX中的監聽ccTouchBegan事件,你應該讓XX類在註冊監聽的時候讓其優先順序調整高於YY類,並且XX類中ccTouchBegan函式return NO,那麼當使用者觸屏後,首先進入XX類中處理事件,然後會(因為XX類return NO)進入YY類,那麼在YY類的ccTouchBegan函式中因為return YES;這樣cocos2d就能響應ccTouchMoved函式了;

如果說你想讓XX與YY類都響應ccTouchMoved函式,至少我利用此種事件分配的方式無法實現,不知道是不是cocos2d的1.0版本遺留的BUG還是其他原因,今天遇到所以拿出來跟大家分享;

OK,該睡覺了,晚安大家~撒樂個油!~~~~~~