EventDispatcher事件分发机制先创建事件,注册到事件管理中心_eventDispatcher,通过发布事件得到响应进行回调,完成事件流。

有五种不同的事件机制:
EventListenerTouch 响应触控事件
EventListenerKeyboard 响应键盘事件
EventListenerAcceleration 响应加速器事件
EventListenMouse 响应鼠标事件
EventListenerCustom 响应自定义的事件

优先权:

  1.优先级越低,越先响应事件

  2.如果优先级相同,则上层的(z轴)先接收触摸事件。

事件监听器的优先级:

  1.addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的。

  2.另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。移除方法:dispatcher->removeEventListener(listener);

事件管理单例获取:
  _eventDispatcher是Node的属性,通过它管理当前节点(场景、层、精灵等)的所有事件的分发。但它本身是一个单例模式值的引用,在Node的构造函数中,通过Director::getInstance()->getEventDispatcher(); 获取,有了这个属性,就能方便的处理事件。

触摸事件:

  

  1. void EventDispatcherTest::funEventTouch(Sprite* sprite)
  2. {
  3. this->_eventDispatcher->removeAllEventListeners();
  4.  
  5. auto listener = EventListenerTouchOneByOne::create();
  6. listener->onTouchBegan = CC_CALLBACK_2(EventDispatcherTest::onTouchBeganss,this);
  7. listener->onTouchMoved = CC_CALLBACK_2(EventDispatcherTest::onTouchMovedss,this);
  8. listener->onTouchEnded = CC_CALLBACK_2(EventDispatcherTest::onTouchEndedss,this);
  9. listener->onTouchCancelled = CC_CALLBACK_2(EventDispatcherTest::onTouchCancelledss,this);
  10. listener->setSwallowTouches(true);//是否向下传递
  11. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,sprite);
  12. }
  13.  
  14. bool EventDispatcherTest::onTouchBeganss(Touch* touch,Event* ev)
  15. {
  16. auto target = static_cast<Sprite*>(ev->getCurrentTarget());
  17.  
  18. Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
  19. Size s = target->getContentSize();
  20. Rect rect = Rect(, , s.width, s.height);
  21.   //判断触摸区域是否在目标上
  22. if (rect.containsPoint(locationInNode))
  23. {
  24. label->setString("onTouchBegan......");
  25. target->setOpacity();
  26. return true;
  27. }
  28. return false;
  29. }
  30. void EventDispatcherTest::onTouchMovedss(Touch* touch,Event* ev)
  31. {
  32. auto target = static_cast<Sprite*>(ev->getCurrentTarget());
  33. target->setPosition(target->getPosition() + touch->getDelta());
  34. label->setString("onTouchMoved......");
  35. }
  36. void EventDispatcherTest::onTouchEndedss(Touch* touch,Event* ev)
  37. {
  38. auto target = static_cast<Sprite*>(ev->getCurrentTarget());
  39. target->setOpacity();
  40. label->setString("onTouchEnded......");
  41. }
  42. void EventDispatcherTest::onTouchCancelledss(Touch* touch,Event* ev)
  43. {
  44. label->setString("onTouchCancelled......");
  45. }

键盘事件

  1. void EventDispatcherTest::funEventKeyboard()
  2. {
  3. this->_eventDispatcher->removeAllEventListeners();
  4.  
  5. auto listener = EventListenerKeyboard::create();
  6. listener->onKeyPressed = CC_CALLBACK_2(EventDispatcherTest::onKeyPressedss,this);
  7. listener->onKeyReleased = CC_CALLBACK_2(EventDispatcherTest::onKeyReleasedss,this);
  8. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
  9. }
  10.  
  11. void EventDispatcherTest::onKeyPressedss(EventKeyboard::KeyCode keycode,Event* ev)
  12. {
  13. char txt[] = {};
  14. sprintf_s(txt,"key %d is Pressed!",(int)keycode);
  15. label->setString(txt);
  16. }
  17.  
  18. void EventDispatcherTest::onKeyReleasedss(EventKeyboard::KeyCode keycode,Event* ev)
  19. {
  20. label->setString("key is Released!");
  21. }

鼠标事件

  1. void EventDispatcherTest::funEventMouse(Sprite* sprite)
  2. {
  3. this->_eventDispatcher->removeAllEventListeners();
  4.  
  5. auto listener = EventListenerMouse::create();
  6. listener->onMouseDown = CC_CALLBACK_1(EventDispatcherTest::onMouseDownss,this);
  7. listener->onMouseMove = CC_CALLBACK_1(EventDispatcherTest::onMouseMovess,this);
  8. listener->onMouseUp = CC_CALLBACK_1(EventDispatcherTest::onMouseUpss,this);
  9. listener->onMouseScroll = CC_CALLBACK_1(EventDispatcherTest::onMouseScrollss,this);
  10. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,sprite);
  11. }
  12.  
  13. void EventDispatcherTest::onMouseDownss(Event* ev)
  14. {
  15. label->setString("onMouseDown!");
  16. }
  17. void EventDispatcherTest::onMouseMovess(Event* ev)
  18. {
  19. label->setString("onMouseMove!");
  20. }
  21. void EventDispatcherTest::onMouseUpss(Event* ev)
  22. {
  23. label->setString("onMouseUp!");
  24. }
  25. void EventDispatcherTest::onMouseScrollss(Event* ev)
  26. {
  27. label->setString("onMouseScroll!");
  28. }

自定义事件

  

  1. //自定義事件
  2. funEventCustom();
  3. //2秒後派發一次自定義事件,測試
  4. scheduleOnce(schedule_selector(EventDispatcherTest::dispatcherCustomEvents),2.0f);
  1. void EventDispatcherTest::funEventCustom()
  2. {
  3. auto listener = EventListenerCustom::create("custom_event_1",CC_CALLBACK_1(EventDispatcherTest::onEventCustom,this));
  4. this->_eventDispatcher->addEventListenerWithFixedPriority(listener,);//添加到事件分發器
  5. }
  6.  
  7. void EventDispatcherTest::dispatcherCustomEvents(float at)
  8. {
  9. //派發事件custom_event_1 事件內容為字符串custom event test!
  10. this->_eventDispatcher->dispatchCustomEvent("custom_event_1","custom event test!");
  11. }
  12.  
  13. void EventDispatcherTest::onEventCustom(EventCustom* event)
  14. {
  15. auto data = static_cast<char*>(event->getUserData());
  16. label->setString(data);
  17. }

加速器事件

  除了触摸,移动设备上一个很重要的输入源是设备的方向,因此大多数设备都配备了加速计,用于测量设备静止或匀速运动时所受到的重力方向。

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

加速计监听器EventListenerAcceleration,其静态create方法中有个Acceleration的参数。Acceleration是一个类,包含了加速计获得的3个方向的加速度。

  1. void EventDispatcherTest::funEventAcceleration()
  2. {
  3. //啟動硬件設備
  4. Device::setAccelerometerEnabled(true);
  5.  
  6. auto listener = EventListenerAcceleration::create(CC_CALLBACK_2(EventDispatcherTest::onAcceleration,this));
  7. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
  8. }
  9.  
  10. void EventDispatcherTest::onAcceleration(Acceleration* acc,Event* event)
  11. {
  12. char str[]={};
  13. sprintf_s(str,"x:%2d,y:%2d,z:%2d,timestamp:%2d",acc->x,acc->y,acc->z,acc->timestamp);
  14. log(str);
  15. }

示例代码

  1. #ifndef __EventDispatcherTest__
  2. #define __EventDispatcherTest__
  3.  
  4. #include "cocos2d.h"
  5.  
  6. USING_NS_CC;
  7.  
  8. class EventDispatcherTest : public Layer
  9. {
  10. public:
  11. CREATE_FUNC(EventDispatcherTest);
  12. virtual bool init();
  13. static Scene* createScene();
  14. LabelTTF* label;
  15. void funEventTouch(Sprite* sprite);
  16. void funEventKeyboard();
  17. void funEventMouse(Sprite* sprite);
  18. void funEventCustom();
  19. void funEventAcceleration();
  20.  
  21. bool onTouchBeganss(Touch* touch,Event* ev);
  22. void onTouchMovedss(Touch* touch,Event* ev);
  23. void onTouchEndedss(Touch* touch,Event* ev);
  24. void onTouchCancelledss(Touch* touch,Event* ev);
  25.  
  26. void onKeyPressedss(EventKeyboard::KeyCode keycode,Event* ev);
  27. void onKeyReleasedss(EventKeyboard::KeyCode keycode,Event* ev);
  28.  
  29. void onMouseDownss(Event* ev);
  30. void onMouseMovess(Event* ev);
  31. void onMouseUpss(Event* ev);
  32. void onMouseScrollss(Event* ev);
  33.  
  34. void dispatcherCustomEvents(float at);
  35. void onEventCustom(EventCustom* event);
  36.  
  37. void onAcceleration(Acceleration* acc,Event* event);
  38. };
  39.  
  40. #endif

EventDispatcherTest.h

  1. #include "EventDispatcherTest.h"
  2. Scene* EventDispatcherTest::createScene()
  3. {
  4. auto scene = Scene::create();
  5. auto layer = EventDispatcherTest::create();
  6. scene->addChild(layer);
  7. return scene;
  8. }
  9.  
  10. bool EventDispatcherTest::init()
  11. {
  12.  
  13. Size visibleSize = Director::getInstance()->getVisibleSize();
  14. Vec2 origin = Director::getInstance()->getVisibleOrigin();
  15. label = LabelTTF::create("Hello World", "Arial", );
  16. label->setPosition(Vec2(origin.x + visibleSize.width/,
  17. origin.y + visibleSize.height - label->getContentSize().height));
  18. this->addChild(label, );
  19.  
  20. auto sprite = Sprite::create("MagentaSquare.png",Rect(,,,));
  21. sprite->setPosition(visibleSize/);
  22. this->addChild(sprite);
  23.  
  24. //funEventTouch(sprite); //觸摸事件
  25. //funEventKeyboard(); //鍵盤事件
  26. //funEventMouse(sprite);//鼠標事件
  27. //funEventAcceleration();//加速器事件
  28.  
  29. //自定義事件
  30. funEventCustom();
  31. //2秒後派發一次自定義事件,測試
  32. scheduleOnce(schedule_selector(EventDispatcherTest::dispatcherCustomEvents),2.0f);
  33. return true;
  34. }
  35.  
  36. void EventDispatcherTest::funEventTouch(Sprite* sprite)
  37. {
  38. this->_eventDispatcher->removeAllEventListeners();
  39.  
  40. auto listener = EventListenerTouchOneByOne::create();
  41. listener->onTouchBegan = CC_CALLBACK_2(EventDispatcherTest::onTouchBeganss,this);
  42. listener->onTouchMoved = CC_CALLBACK_2(EventDispatcherTest::onTouchMovedss,this);
  43. listener->onTouchEnded = CC_CALLBACK_2(EventDispatcherTest::onTouchEndedss,this);
  44. listener->onTouchCancelled = CC_CALLBACK_2(EventDispatcherTest::onTouchCancelledss,this);
  45. listener->setSwallowTouches(true);//是否向下传递
  46. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,sprite);
  47. }
  48.  
  49. bool EventDispatcherTest::onTouchBeganss(Touch* touch,Event* ev)
  50. {
  51. auto target = static_cast<Sprite*>(ev->getCurrentTarget());
  52.  
  53. Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
  54. Size s = target->getContentSize();
  55. Rect rect = Rect(, , s.width, s.height);
  56.  
  57. if (rect.containsPoint(locationInNode))
  58. {
  59. label->setString("onTouchBegan......");
  60. target->setOpacity();
  61. return true;
  62. }
  63. return false;
  64. }
  65. void EventDispatcherTest::onTouchMovedss(Touch* touch,Event* ev)
  66. {
  67. auto target = static_cast<Sprite*>(ev->getCurrentTarget());
  68. target->setPosition(target->getPosition() + touch->getDelta());
  69. label->setString("onTouchMoved......");
  70. }
  71. void EventDispatcherTest::onTouchEndedss(Touch* touch,Event* ev)
  72. {
  73. auto target = static_cast<Sprite*>(ev->getCurrentTarget());
  74. target->setOpacity();
  75. label->setString("onTouchEnded......");
  76. }
  77. void EventDispatcherTest::onTouchCancelledss(Touch* touch,Event* ev)
  78. {
  79. label->setString("onTouchCancelled......");
  80. }
  81.  
  82. void EventDispatcherTest::funEventKeyboard()
  83. {
  84. this->_eventDispatcher->removeAllEventListeners();
  85.  
  86. auto listener = EventListenerKeyboard::create();
  87. listener->onKeyPressed = CC_CALLBACK_2(EventDispatcherTest::onKeyPressedss,this);
  88. listener->onKeyReleased = CC_CALLBACK_2(EventDispatcherTest::onKeyReleasedss,this);
  89. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
  90. }
  91.  
  92. void EventDispatcherTest::onKeyPressedss(EventKeyboard::KeyCode keycode,Event* ev)
  93. {
  94. char txt[] = {};
  95. sprintf_s(txt,"key %d is Pressed!",(int)keycode);
  96. label->setString(txt);
  97. }
  98.  
  99. void EventDispatcherTest::onKeyReleasedss(EventKeyboard::KeyCode keycode,Event* ev)
  100. {
  101. label->setString("key is Released!");
  102. }
  103.  
  104. void EventDispatcherTest::funEventMouse(Sprite* sprite)
  105. {
  106. this->_eventDispatcher->removeAllEventListeners();
  107.  
  108. auto listener = EventListenerMouse::create();
  109. listener->onMouseDown = CC_CALLBACK_1(EventDispatcherTest::onMouseDownss,this);
  110. listener->onMouseMove = CC_CALLBACK_1(EventDispatcherTest::onMouseMovess,this);
  111. listener->onMouseUp = CC_CALLBACK_1(EventDispatcherTest::onMouseUpss,this);
  112. listener->onMouseScroll = CC_CALLBACK_1(EventDispatcherTest::onMouseScrollss,this);
  113. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,sprite);
  114. }
  115.  
  116. void EventDispatcherTest::onMouseDownss(Event* ev)
  117. {
  118. label->setString("onMouseDown!");
  119. }
  120. void EventDispatcherTest::onMouseMovess(Event* ev)
  121. {
  122. label->setString("onMouseMove!");
  123. }
  124. void EventDispatcherTest::onMouseUpss(Event* ev)
  125. {
  126. label->setString("onMouseUp!");
  127. }
  128. void EventDispatcherTest::onMouseScrollss(Event* ev)
  129. {
  130. label->setString("onMouseScroll!");
  131. }
  132.  
  133. void EventDispatcherTest::funEventCustom()
  134. {
  135. auto listener = EventListenerCustom::create("custom_event_1",CC_CALLBACK_1(EventDispatcherTest::onEventCustom,this));
  136. this->_eventDispatcher->addEventListenerWithFixedPriority(listener,);//添加到事件分發器
  137. }
  138.  
  139. void EventDispatcherTest::dispatcherCustomEvents(float at)
  140. {
  141. //派發事件custom_event_1 事件內容為字符串custom event test!
  142. this->_eventDispatcher->dispatchCustomEvent("custom_event_1","custom event test!");
  143. }
  144.  
  145. void EventDispatcherTest::onEventCustom(EventCustom* event)
  146. {
  147. auto data = static_cast<char*>(event->getUserData());
  148. label->setString(data);
  149. }
  150.  
  151. void EventDispatcherTest::funEventAcceleration()
  152. {
  153. //啟動硬件設備
  154. Device::setAccelerometerEnabled(true);
  155.  
  156. auto listener = EventListenerAcceleration::create(CC_CALLBACK_2(EventDispatcherTest::onAcceleration,this));
  157. this->_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
  158. }
  159.  
  160. void EventDispatcherTest::onAcceleration(Acceleration* acc,Event* event)
  161. {
  162. char str[]={};
  163. sprintf_s(str,"x:%2d,y:%2d,z:%2d,timestamp:%2d",acc->x,acc->y,acc->z,acc->timestamp);
  164. log(str);
  165. }

EventDispatcherTest.cpp

Cocos2d-x 3.2 学习笔记(九)EventDispatcher事件分发机制的更多相关文章

  1. Cocos2d-x 学习笔记(15.2) EventDispatcher 事件分发机制 dispatchEvent(event)

    1. 事件分发方法 EventDispatcher::dispatchEvent(Event* event) 首先通过_isEnabled标志判断事件分发是否启用. 执行 updateDirtyFla ...

  2. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  3. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  4. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  5. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  6. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  7. iOS学习笔记之触摸事件&UIResponder

    iOS学习笔记之触摸事件&UIResponder 触摸事件 与触摸事件相关的四个方法如下: 一根手指或多根手指触摸屏幕 -(void)touchesBegan:(NSSet *)touches ...

  8. Android程序员事件分发机制学习笔记

    通过问题来学习一个东西是很好的方法.学习Android中View的事件体系,我也通过给自己提问题,在解决问题的同时也就知道了其中原理. 首先来几个问题起步: 什么是事件?什么是事件分发机制? 在我们通 ...

  9. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...

随机推荐

  1. android开发时使用游标时一定要关闭

    原代码如下: places = getPlaceDatas(context, cursor); cursor.close(); 应改为: try{ places = getPlaceDatas(con ...

  2. Apache Shiro (一)

    参考博客: http://jinnianshilongnian.iteye.com/blog/2018398 1.shiro简介 Apache shiro 是一个JAVA框架,可用于身份难和授权.sh ...

  3. Linux环境下中文字体乱码处理办法

    项目中包含了一项生成JPG图片的功能,该功能需要使用JAVA的Graphics2D动态生成图片中的文字,原来在Windows平台中没有发现问题,但是迁移至Linux平台后发现生成的中文变成了乱码. 百 ...

  4. 使用pango-Cairo列出系统中的有效字体

    使用pango-Cairo列出系统中的有效字体,代码来源于gtk-app-devel-list fonts list using pango #include <glib.h> #incl ...

  5. Xamarin.IOS之快速入门

    欢迎大家加入以下开源社区 Xamarin-Cn:https://github.com/Xamarin-Cn Mvvmcross-Cn:https://github.com/Mvvmcross-Cn  ...

  6. SqlServer2012 数据库的同步问题汇总

    1.当订阅由发布服务器集中管理时正常,而把这些订阅分由订阅服务器管理,在发布服务器初始化订阅时,这些订阅就会出现无法访问某地址的问题,即使添加Everyone的完全控制权限也无用. 2.SqlServ ...

  7. ubuntu笔记

    安装包 sudo dpkg -i xxxx.deb 如果用户具有sudo权限,那么直接可以运行如下命令: #sudo su root #passwd #更改密码 或者直接运行sudo passwd r ...

  8. 解决ng界面长表达式(ui-set)

    本文来自网友sun shine的问题,问题如下: 您好, 我想求教一个问题. 在$scope中我的对象名字写的特别深, 在 html中我又多次用到了同一个对象, 对不对在 html中让它绑定到一个临时 ...

  9. 通过分析iframe和无阻塞脚本关系能让我们更懂iframe

    在我上篇文章里,我提到一种使用iframe完成无阻塞脚本加载的方式,因为我对iframe的偏见很大,所以上篇文章里我没有展开讨论这个问题. 文章发表后有位网友问了我这样一个问题,下面是他问题的原文,如 ...

  10. Propagation of Visual Entity Properties Under Bandwidth Constraints

    1. Introduction The Saga of Ryzom is a persistent massively-multiplayer online game (MMORPG) release ...