本文主要是介绍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的点击。
这篇关于cocos2d-x中CCScrollView和CCMenu触摸优先级的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!