您的位置:首页 > 移动开发 > Cocos引擎

关于cocos2dx3.X版本的触摸响应的…

2015-10-20 15:22 351 查看
相比2.X版本,触摸响应的处理方式差别还挺大的。
之前2.x的写法是:先在Layer中打开触摸开关(setTouchEnabled(true)),
然后重写registerWithTouchDispatcher()以及3个触摸处理函数。
2.x的方法很简单,而3.x则要复杂一些,刚接触时还真有点不习惯。如下:
1. 定义一个事件倾听器

2.对事件倾听器进行设置,主要是设置setSwallowTouches()和3个触摸处理函数。
setSwallowTouches用于设置是否吞没事件,也就是当某个触摸事件回调的时,截断该事件,让它不能继续传递给其他人。后面结合例子说明。3.将事件倾听器与目标绑定,目标可以是精灵,层等。
sprListener,poker);

这样就完成了触摸响应的所有步骤,相比2.x的一点差异就是将触摸和目标绑定在一起,而目标可以在事件中取出。
bool pokerOfPlayer::selectPoker(Touch *pTouch, Event* pEvent){    auto target=static_cast(pEvent->getCurrentTarget());//...}

这样一来对莫个触摸区域的判断就方便得多了(比如要判断触摸点是否在目标精灵上)。回头说一下setSwallowTouches()函数,一开始一直没弄懂是什么意思,后来实践后才明白。比如下图的纸牌游戏,



纸牌之间相互重叠,如果不设置触摸优先级,则点击重叠部分(尽管下面的被遮住了),两张牌都会被选中。
我们在绑定目标的时候其实已经设置了触摸的优先级。
sprListener,poker);

这个函数会自动按照节点的绘图层设置优先级,即最上面最优先。但是除了设置优先级还不够,还需要设置吞没事件,当setSwallowTouches()传入参数为true时,一旦事件被处理了,则不会传递给下一优先级的触摸倾听。而这个“事件被处理了”取决于你的onTouchBegan()函数是否返回true。另外再说一个,有多个精灵有同样的触摸处理函数,可以直接用
sprListener->clone(),poker);

而不需要重新编写事件倾听器,clone()函数会自动复制原倾听器的处理函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: