Cocos2d-x 3.x新事件分发机制总结

Cocos2d-x 3.x新事件分发机制总结,第1张

概述转载自 shahdza http://cn.cocos2d-x.org/tutorial/show?id=1623 在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐。而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器EventDispatcher 来进行统一的管理。 事件监听器主要有: 触摸事件     :

转载自 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

单点触摸监听器相关:

8
// static EventListenertouchOneByOne*create(); std::function< (touch*,Event*)>ontouchBegan; //只有这个返回值为bool 使用举例:

23
//获取事件分发器 autodispatcher=Director::getInstance()->getEventdispatcher(); //创建单点触摸监听器EventListenertouchOneByOne autotouchListener=EventListenertouchOneByOne::create(); //单点触摸响应事件绑定 touchListener->ontouchBegan=CC_CALLBACK_2(HelloWorld::ontouchBegan,153)!important; background:none!important">this ); touchListener->ontouchmoved=CC_CALLBACK_2(HelloWorld::ontouchmoved,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); touchListener->ontouchended=CC_CALLBACK_2(HelloWorld::ontouchended,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); touchListener->ontouchCancelled=CC_CALLBACK_2(HelloWorld::ontouchCancelled,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); //在事件分发器中,添加触摸监听器,事件响应委托给this处理 dispatcher->addEventListenerWithSceneGraPHPriority(touchListener,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); //单点触摸事件响应函数 ontouchBegan(touch*touch,Event*unused_event){cclOG( "began" ); return true ;} ontouchmoved(touch*touch,monospace!important; Font-size:1em!important; min-height:inherit!important; color:blue!important; background:none!important">"moved" );} ontouchended(touch*touch,monospace!important; Font-size:1em!important; min-height:inherit!important; color:blue!important; background:none!important">"ended" );} ontouchCancelled(touch*touch,monospace!important; Font-size:1em!important; min-height:inherit!important; color:blue!important; background:none!important">"cancelled" );} 2、多点触摸:EventListenertouchAllAtOnce

多点触摸监听器相关:

8
EventListenertouchAllAtOnce*create(); ( std::vector<touch*>&,Event*)>ontouchesBegan; 使用举例:

23
//创建多点触摸监听器EventListenertouchAllAtOnce autotouchesListener=EventListenertouchAllAtOnce::create(); //多点触摸响应事件绑定 touchesListener->ontouchesBegan=CC_CALLBACK_2(HelloWorld::ontouchesBegan,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">touchesListener->ontouchesMoved=CC_CALLBACK_2(HelloWorld::ontouchesMoved,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">touchesListener->ontouchesEnded=CC_CALLBACK_2(HelloWorld::ontouchesEnded,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">touchesListener->ontouchesCancelled=CC_CALLBACK_2(HelloWorld::ontouchesCancelled,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">dispatcher->addEventListenerWithSceneGraPHPriority(touchesListener,0)!important; background:none!important">//多点触摸事件响应函数 ontouchesBegan( std::vector<touch*>&touches,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">);} ontouchesMoved( ontouchesEnded( ontouchesCancelled( 【鼠标事件】

EventListenerMouse,主要用于监听鼠标的点击、松开、移动、滚轮的事件。

鼠标事件监听器相关:

8
EventListenerMouse*create(); (Event*event)>onMouseDown; //按下鼠标,单击鼠标 (Event*event)>onmouseup; //松开鼠标,按下的状态下松开 (Event*event)>onMouseMove; //移动鼠标,在屏幕中移动 (Event*event)>onMouseScroll; //滚动鼠标,滚动鼠标的滚轮 23
//创建鼠标事件监听器EventListenerMouse EventListenerMouse*mouseListenter=EventListenerMouse::create(); //鼠标事件响应函数 mouseListenter->onMouseDown=CC_CALLBACK_1(HelloWorld::onMouseDown,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">mouseListenter->onmouseup=CC_CALLBACK_1(HelloWorld::onmouseup,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">mouseListenter->onMouseMove=CC_CALLBACK_1(HelloWorld::onMouseMove,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">mouseListenter->onMouseScroll=CC_CALLBACK_1(HelloWorld::onMouseScroll,0)!important; background:none!important">//添加鼠标事件监听器,事件响应处理委托给this dispatcher->addEventListenerWithSceneGraPHPriority(mouseListenter,0)!important; background:none!important">//事件响应函数 onMouseDown(Event*event){cclOG( "Down" onmouseup(Event*event){cclOG( "UP" onMouseMove(Event*event){cclOG( "MOVE" onMouseScroll(Event*event){cclOG( "Scroll"

【键盘事件】

EventListenerKeyboard,主要用于监听键盘某个键的按下、松开的事件。

键盘事件监听器相关:

17
EventListenerKeyboard*create(); (EventKeyboard::KeyCode,Event*)>onKeypressed; //按下某键 //松开某键 //键盘按键枚举类型EventKeyboard::KeyCode //KeyCode的值对应的不是键盘的键值、也不是ASCII码,只是纯粹的枚举类型 //如: //EventKeyboard::KeyCode::KEY_A //EventKeyboard::KeyCode::KEY_1 //EventKeyboard::KeyCode::KEY_F1 //EventKeyboard::KeyCode::KEY_SPACE //EventKeyboard::KeyCode::KEY_ALT //EventKeyboard::KeyCode::KEY_SHIFT 27
//创建键盘按键事件监听器 EventListenerKeyboard*keyboardListener=EventListenerKeyboard::create(); //绑定事件响应函数 keyboardListener->onKeypressed=CC_CALLBACK_2(HelloWorld::onKeypressed,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">keyboardListener->onkeyreleased=CC_CALLBACK_2(HelloWorld::onkeyreleased,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important"> //添加监听器 dispatcher->addEventListenerWithSceneGraPHPriority(keyboardListener,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">); //事件响应函数 onKeypressed(EventKeyboard::KeyCodekeyCode,Event*event){ if (EventKeyboard::KeyCode::KEY_J==keyCode){ cclOG( "pressed:J" ); } } onkeyreleased(EventKeyboard::KeyCodekeyCode,Event*event){ (EventKeyboard::KeyCode::KEY_SPACE==keyCode){ "Released:SPACE" ); } } 【加速计事件】

EventListeneracceleration,主要用于监听移动设备的所受重力方向感应事件。

重力感应来自移动设备的加速计,通常支持 (X,Y,Z) 三个方向的加速度感应,所以又称为三向加速计。在实际应用中,可以根据3个方向的力度大小来计算手机倾斜的角度或方向。

1、加速计信息类acceleration

该类中每个方向的加速度,大小都为一个重力加速度大小。

6
//加速计信息 acceleration { double x; y; z; }; 2、开启加速计感应

在使用加速计事件监听器之前,需要先启用此硬件设备:

1
Device::setAccelerometerEnabled( );

3、加速计监听器相关

5
EventListeneracceleration*create( (acceleration*,Event*)>&callback); 4、使用举例

41
//标签:显示加速计信息 label=Label::createWithTTF( "noused" , "MarkerFelt.ttf" label->setposition(visibleSize/2); ->addChild(label); //小球:可视化加速计 ball=Sprite::create( "ball.png" ball->setposition(visibleSize/2); ->addChild(ball); //获取事件分发器 autodispatcher=Director::getInstance()->getEventdispatcher(); //需要开启移动设备的加速计 ); //创建加速计事件监听器 autoaccelerationListener=EventListeneracceleration::create(CC_CALLBACK_2(HelloWorld::onaccelerationEvent,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important">)); //添加加速计监听器 dispatcher->addEventListenerWithSceneGraPHPriority(accelerationListener,monospace!important; Font-size:1em!important; min-height:inherit!important; background:none!important"> //事件响应函数 HelloWorld::onaccelerationEvent(acceleration*acceleration,Event*event) { char s[100]; sprintf (s,monospace!important; Font-size:1em!important; min-height:inherit!important; color:blue!important; background:none!important">"X:%f;Y:%f;Z:%f;" label->setString(s); //改变小球ball的位置 float x=ball->getpositionX()+acceleration->x*10; y=ball->getpositionY()+acceleration->y*10; Vec2pos=Vec2(x,y); pos.clamp(ball->getContentSize()/2,Vec2(288,512)-ball->getContentSize()/2); ball->setposition(pos); //设置位置 } 5、实际效果

在电脑上看不出效果,需要移植到手机上,才能看到加速计的效果。

【自定义事件】

以上是系统自带的事件类型,事件由系统内部自动触发,如 触摸屏幕,键盘响应等。

EventListenerCustom 自定义事件,它不是由系统自动触发,而是人为的干涉。

1、创建自定义监听器

5
//eventname:监听器名字 //callback:监听器函数 EventListenerCustom*create( (EventCustom*)>&callback); 2、分发自定义事件

自定义的事件监听器,需要通过手动的方式,将事件分发出去。

通过 EventCustom(string eventname); 来获取自定义监听器。

通过 dispatcher->dispatchEvent(&event); 来手动将事件分发出去。

4
EventCustomevent( "your_event_type" ); dispatcher->dispatchEvent(&event); 3、使用举例

23
//创建自定义事件监听器 //监听器名字:"custom_event" //事件响应函数:HelloWorld::onCustomEvent autocustomListener=EventListenerCustom::create( "custom_event" )); //添加自定义事件监听器,优先权为1 dispatcher->addEventListenerWithFixedPriority(customListener,1); //手动分发监听器的事件,通过dispatchEvent EventCustomevent=EventCustom( ); dispatcher->dispatchEvent(&event); HelloWorld::onCustomEvent(EventCustom*event) { "onCustomEvent" ); } 4、说明

每个自定义的事件监听器,都有一个监听器名字eventname。

需要手动通过 dispatcher->dispatchEvent(&event); 来手动将事件分发出去。

可以通过 dispatcher->dispatchCustomEvent(,); 来给自定义事件监听器绑定一个用户数据。

来源网址:http://www.jb51.cc/article/p-zwifwspg-wx.html

总结

以上是内存溢出为你收集整理的Cocos2d-x 3.x新事件分发机制总结全部内容,希望文章能够帮你解决Cocos2d-x 3.x新事件分发机制总结所遇到的程序开发问题。

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

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

原文地址: https://www.outofmemory.cn/web/1032301.html

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

发表评论

登录后才能评论

评论列表(0条)