李華明Himi 原創,轉載務必在明顯處註明:
轉載自【黑米GameDev街區】 原文連結: http://www.himigame.com/iphone-cocos2d/453.html
上一章節中介紹了,如何利用兩種方式對使用者觸屏進行監聽,那麼今天要重點講解一個問題;
要講的問題主要是在使用註冊監聽(事件分配方式監聽觸屏)中的問題,上一章節中說過,此種方式首先要註冊:如下代碼:
//註冊獨立觸摸事件[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
那麼如果多個註冊監聽的話,可以根據優先順序(priority)參數進行設定,此參數的值越大,優先順序越低,假設有XX與YY註冊了監聽,如果XX優先順序>YY的話,那麼首先會進入XX的監聽函數;
使用上面的方式進行監聽的話,會進行監聽以下這幾個事件:
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{return NO;}- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event{ }- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{}
如果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,該睡覺了,晚安大家~ ~~~~~~