關於cocos2d-x中CCScrollView和CCMenu觸摸優先級的解決方案


  最近使用cocos2d-x寫一款跨平台的游戲,有這樣一個功能需求,手機屏幕的某塊區域可上下滾動,滾動區域的內容又是可點擊的按鈕。首先想到在CCScrollView里面添加CCMenu。恰好這個CCMenu是一張張圖片,即CCItemImage,當圖片布滿整個滾動區域的時候,你會發現CCScrollView滑動不了了。原因很簡單,是CCMenu的觸摸事件吃掉了CCScrollView的觸摸事件,因為CCMenu的默認觸摸優先級是最高的。於是就有兩套解決方案,一是改變CCScrollView的優先級,使之比CCMenu還高,CCMenu的默認優先級是-128,CCScrollView的默認優先級是0,cocos2d-x中數值越低,優先級越高。二是改變CCMenu的優先級,使之比CCScrollView低就行了。

  接下來如何改還是個問題,我們知道CCMenu和CCScrollView都是繼承CCLayer的,CCLayer有一個虛方法registerWithTouchDispatcher,在此方法中用如下代碼CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority, true);控制此Layer的優先級。而CCMenu和CCScrollView都復寫了此方法。我們只需要在復寫的方法中修改優先級就可以了。我們最好不要改動cocos2d的源碼,所以我們可以寫一個自己的menu來繼承CCMenu,並復寫registerWithTouchDispatcher方法,代碼如下:

1 class MyMenu : public CCMenu{
2     virtual void registerWithTouchDispatcher(){
3         //這里優先級設為1,只要比CCScrollView低就可以
4         CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 1, true);
5     }
6 }

接下來用MyMenu替換原來的CCMenu就行了,這樣它會先響應CCScrollView的滑動,再響應CCMenu的點擊。

(在不斷的嘗試中總結經驗,以幫助后面的人更快的上路,http://zhs.guohe.in/)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM