关于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/)