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

相比2.X版本,触摸响应的处理方式差别还挺大的。
之前2.x的写法是:先在Layer中打开触摸开关(setTouchEnabled(true)), 然后重写registerWithTouchDispatc her()以及3个触摸处理函数。
2.x的方法很简单,而3.x则要复杂一些,刚接触时还真有点不习惯。如下:
1. 定义一个事件倾听器
      auto sprListener=EventListenerTouchOneByOne::create();
//这是一个单点触摸事件倾听
2.对事件倾听器进行设置,主要是设置setSwallowTouches()和3个触摸处理函数。
        sprListener->setSwallowTouches(true);
        sprListener->onTouchBegan=CC_CALLBACK_2(pokerOfPlayer::selectPoker,this);
//以及onTouchMoved, onTouchEnded.
setSwallowTouches用于设置是否吞没事件,也就是当某个触摸事件回调的时,截断该事件,让它不能继续传递给其他人。后面结合例子说明。
3.将事件倾听器与目标绑定,目标可以是精灵,层等。
auto poker=Sprite::create("H1.png");

_eventDispatcher->addEventListenerWithSceneGraphPriority(
sprListener,poker);
这样就完成了触摸响应的所有步骤,相比2.x的一点差异就是将触摸和目标绑定在一起,而目标可以在事件中取出。
bool pokerOfPlayer::selectPoker(Touch *pTouch, Event* pEvent)
{
    auto target=static_cast(pEvent->getCurrentTarget());
//...
}
这样一来对莫个触摸区域的判断就方便得多了(比如要判断触摸点是否在目标精灵上)。


回头说一下 setSwallowTouches()函数,一开始一直没弄懂是什么意思,后来实践后才明白。比如下图的纸牌游戏,
关于cocos2dx3.X版本的触摸响应的记录
纸牌之间相互重叠,如果不设置触摸优先级,则点击重叠部分(尽管下面的被遮住了),两张牌都会被选中。
我们在绑定目标的时候其实已经设置了触摸的优先级。
_eventDispatcher->addEventListenerWithSceneGraphPriority(sprListener,poker);
这个函数会自动按照节点的绘图层设置优先级,即最上面最优先。但是除了设置优先级还不够,还需要设置吞没事件,当 setSwallowTouches()传入参数为true时,一旦事件被处理了,则不会传递给下一优先级的触摸倾听。而这个“事件被处理了”取决于你的onTouchBegan()函数是否返回true。


另外再说一个,有多个精灵有同样的触摸处理函数,可以直接用
_eventDispatcher->addEventListenerWithSceneGraphPriority(sprListener->clone(),poker);
而不需要重新编写事件倾听器,clone()函数会自动复制原倾听器的处理函数。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值