最近使用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/)
