cocos2dx 3.0 触摸机制

cocos2dx 3.0 触摸机制,第1张

概述转自http://blog.csdn.net/shun_fzll/article/details/24014967 在cocos2dx 3.0版本中,废弃了以往2.x版本的写法,我们先来看一下Layer.h中的一段代码 [cpp]  view plain copy /* Callback function should not be deprecated, it will generate lot

转自http://blog.csdn.net/shun_fzll/article/details/24014967

在cocos2dx 3.0版本中,废弃了以往2.x版本的写法,我们先来看一下Layer.h中的一段代码


[cpp] view plain copy /*Callbackfunctionshouldnotbedeprecated,itwillgeneratelotsofwarnings. Since'settouchEnabled'wasdeprecated,itwillmakewarningsifdeveloperoverrIDesontouchXXXandinvokessettouchEnabled(true)insteadofusingEventdispatcher::addEventListenerWithXXX. */ //单点触摸 virtualboolontouchBegan(touch*touch,Event*unused_event); virtualvoIDontouchmoved(touch*touch,Event*unused_event); voIDontouchended(touch*touch,153); Font-weight:bold; background-color:inherit">voIDontouchCancelled(touch*touch,0); background-color:inherit">//多点触摸 voIDontouchesBegan(conststd::vector<touch*>&touches,153); Font-weight:bold; background-color:inherit">voIDontouchesMoved(voIDontouchesEnded(voIDontouchesCancelled(

 

单点触摸:(即只有注册的Layer才能接收触摸事件)

ontouchBegan:如果返回true:本层的后续touch事件可以被触发,并阻挡向后层传递

如果返回false,本层的后续touch事件不能被触发,并向后传递

简单点来说,如果

1.Layer 只有一层的情况:

virtualboolontouchBegan(CCtouch*ptouch,CCEvent*pEvent); a.返回false,则cctouchmoved(),cctouchended()不会再接收到消息 b.返回true,则cctouchmoved(),cctouchended()可以接收到消息 2.Layer 有多层的情况: CCEvent*pEvent); a.返回false,则本层的ontouchmoved(),ontouchended()不会再接收到消息,但是本层之下的其它层会接收到消息 b.返回true,则本层的ontouchmoved(),ontouchended()可以接收到消息,但是本层之下的其它层不能再接收到消息

单点触摸简单用法:

在Layer中添加如下代码,重写ontouchxxx函数

autodispatcher=Director::getInstance()->getEventdispatcher(); autoListener=EventListenertouchOneByOne::create(); Listener->ontouchBegan=CC_CALLBACK_2(GameLayer::ontouchBegan,this); Listener->ontouchmoved=CC_CALLBACK_2(GameLayer::ontouchmoved,153); Font-weight:bold; background-color:inherit">this);
Listener->ontouchended=CC_CALLBACK_2(GameLayer::ontouchended,248)"> Listener->setSwallowtouches(true);//不向下传递触摸 dispatcher->addEventListenerWithSceneGraPHPriority(Listener,153); Font-weight:bold; background-color:inherit">this);


Listener->setSwallowtouches(true),不向下触摸,简单点来说,比如有两个sprite,A 和 B,A在上B在下(位置重叠),触摸A的时候,B不会受到影响

Listener->setSwallowtouches(false)反之,向下传递触摸,触摸A也等于触摸了B


多点触摸点单用法(多个Layer获取屏幕事件):

autoListener1=EventListenertouchAllAtOnce::create(); Listener1->ontouchesBegan=CC_CALLBACK_2(GameLayer::ontouchesBegan,248)"> Listener1->ontouchesMoved=CC_CALLBACK_2(GameLayer::ontouchesMoved,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> Listener1->ontouchesEnded=CC_CALLBACK_2(GameLayer::ontouchesEnded,248)"> dispatcher->addEventListenerWithSceneGraPHPriority(Listener1,153); Font-weight:bold; background-color:inherit">this);
或者settouchEnabled(true),然后重写layer的ontouchsxxx函数

关于eventdispatcher:

获取方法:

[cpp] view plain copy autodispatcher=Director::getInstance()->getEventdispatcher();


事件监听器包含以下几种:

触摸事件 (EventListenertouch) 键盘响应事件 (EventListenerKeyboard) 加速记录事件 (EventListeneracceleration) 鼠标响应事件 (EventListenerMouse) 自定义事件 (EventListenerCustom)

以上事件监听器统一由_eventdispatcher@H_799_403@来进行管理。


优先权: 1.优先级越低,越先响应事件 2.如果优先级相同,则上层的(z轴)先接收触摸事件
有两种方式将 事件监听器 Listener1 添加到 事件调度器_eventdispatcher 中:

[cpp] view plain copy voIDEventdispatcher::addEventListenerWithSceneGraPHPriority(EventListener*Listener,Node*node) voIDEventdispatcher::addEventListenerWithFixedPriority(EventListener*Listener,@H_403_466@intfixedPriority)
代码展开一下: { CCASSERT(Listener&&node,"InvalIDparameters."); CCASSERT(!Listener->isRegistered(),"TheListenerhasbeenregistered."); if(!Listener->checkAvailable()) return; Listener->setSceneGraPHPriority(node); Listener->setFixedPriority(0); Listener->setRegistered(true); addEventListener(Listener); }
intfixedPriority) CCASSERT(Listener,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CCASSERT(fixedPriority!=0,"0priorityisforbIDdenforfixedprioritysinceit'susedforscenegraphbasedpriority."); if(!Listener->checkAvailable()) return; Listener->setSceneGraPHPriority(nullptr); Listener->setFixedPriority(fixedPriority); Listener->setRegistered(true); Listener->setPaused(false); }

(1)addEventListenerWithSceneGraPHPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraPHPriority 使用的。 (2)另外,有一点非常重要,FixedPriority Listener添加完之后需要手动remove,而SceneGraPHPriority Listener是跟node绑定的,在node的析构函数中会被移除。
移除方法: dispatcher->removeEventListener(Listener) 总结

以上是内存溢出为你收集整理的cocos2dx 3.0 触摸机制全部内容,希望文章能够帮你解决cocos2dx 3.0 触摸机制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1014648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)