转载自 shahdza
http://cn.cocos2d-x.org/tutorial/show?ID=1623
在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐。而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器Eventdispatcher 来进行统一的管理。
事件监听器主要有:
触摸事件 : EventListenertouchOneByOne、EventListenertouchAllAtOnce
鼠标响应事件 : EventListenerMouse
键盘响应事件 : EventListenerKeyboard
加速计事件 : EventListeneracceleration
自定义事件 : EventListenerCustom
物理碰撞事件 : EventListenerPhysicsContact
游戏手柄事件 : EventListenerController
【事件分发器】
事件分发器Eventdispatcher,用于统一管理事件监听器的所有事件的分发。
1、_eventdispatcher
_eventdispatcher是Node的属性,通过Director::getInstance()->getEventdispatcher() 获得。
_eventdispatcher的工作由三部分组成:
(1)事件分发器 :Eventdispatcher。
(2)事件类型 :Eventtouch,EventKeyboard 等。
(3)事件监听器 :EventListenertouch,EventListenerKeyboard 等。
监听器实现了各种触发后的逻辑,在适当时候由事件分发器分发事件类型,然后调用相应类型的监听器。
2、添加/删除监听器
添加监听器:addEventListenerWithSceneGraPHPriority,addEventListenerWithFixedPriority。
删除监听器:removeEventListener,removeAllEventListeners。
3、主要函数
包含监听器的添加、删除、暂停、恢复,优先级的设置,手动分发事件等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 @H_404_183@ 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 @H_502_261@ 85 86 | // class Eventdispatcher: public Ref { /** *添加监听器 *-addEventListenerWithSceneGraPHPriority *-addEventListenerWithFixedPriority *-addCustomEventListener */ //使用场景图的优先级为指定事件添加一个监听. //Listener:指定要监听的事件. //node:这个节点的绘制顺序是基于监听优先级. //优先级:0 voID addEventListenerWithSceneGraPHPriority(EventListener*Listener,Node*node); //使用一定的优先级为指定事件添加一个监听. //Listener:指定要监听的事件. //fixedPriority:这个监听器的固定优先级. //优先级:fixedPriority。(但是不能为0,因为他是场景图的基本优先级) addEventListenerWithFixedPriority(EventListener*Listener, int fixedPriority); //用户自定义监听器 EventListenerCustom*addCustomEventListener( const std::string&eventname, std::function< (EventCustom*)>&callback); /** *删除监听器 *-removeEventListener *-removeEventListenersForType *-removeEventListenersForTarget *-removeCustomEventListeners *-removeAllEventListeners */ //删除指定监听器 removeEventListener(EventListener*Listener); //删除某类型对应的所有监听器 //EventListener::Type:: //单点触摸:touch_ONE_BY_ONE //多点触摸:touch_ALL_AT_ONCE //键盘:KEYBOARD //鼠标:MOUSE //加速计:acceleration //自定义:CUSTOM removeEventListenersForType(EventListener::TypeListenerType); //删除绑定在节点target上的所有监听器 removeEventListenersForTarget(Node*target,monospace!important; Font-size:1em!important; min-height:inherit!important; color:gray!important; background:none!important">bool recursive= false ); //删除名字为customEventname的所有自定义监听器 removeCustomEventListeners( std::string&customEventname); //移除所有监听器 removeAllEventListeners(); /** *暂停、恢复在节点target上的所有监听器 *-pauseEventListenersForTarget *-resumeEventListenersForTarget */ pauseEventListenersForTarget(Node*target,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); resumeEventListenersForTarget(Node*target,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); /** *其他 *-setPriority *-setEnabled *-dispatchEvent *-dispatchCustomEvent */ //设置某监听器的优先级 setPriority(EventListener*Listener,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">fixedPriority); //启用事件分发器 setEnabled( isEnabled); isEnabled() ; //手动派发自定义事件 dispatchEvent(Event*event); //给名字为eventname的自定义监听器,绑定用户数据 dispatchCustomEvent( *optionalUserData=nullptr); } // |
4、关于事件监听器的优先权
通过 addEventListenerWithSceneGraPHPriority 添加的监听器,优先权为0。
通过 addEventListenerWithFixedPriority 添加的监听器,可以自定义优先权,但不能为0。
优先级越低,越先响应事件。
如果优先级相同,则上层的(z轴)先接收触摸事件。
5、使用步骤
(1)获取事件分发器 :dispatcher = Director::getInstance()->getEventdispatcher();
(2)创建监听器 :auto Listener = EventListenertouchOneByOne::create();
(3)绑定响应事件函数:Listener->ontouchBegan = CC_CALLBACK_2(callback,this);
(4)将监听器添加到事件分发器dispatcher中:dispatcher->addEventListenerWithSceneGraPHPriority(Listener,this);
(5)编写回调响应函数:bool callback(touch* touch,Event* event) { ... }
【触摸事件】
1、单点触摸:EventListenertouchOneByOne
单点触摸监听器相关:
// static EventListenertouchOneByOne*create(); std::function< (touch*,Event*)>ontouchBegan; //只有这个返回值为bool 使用举例: |
评论列表(0条)