cocos2dx有一个编辑器:cocostudio。眼下来说,已经是比較好用了。仅仅要载入导出的资源。就能够用上了。省去手动搭建面的麻烦。

可是。非常多须要事件的地方,操作比較麻烦,所以这里提供一个事件管理器来集中和简化管理事件。

对于C++事件托付方面。我这里使用了是FastDelegate(注:一个牛人写的)。以下是详细实现的代理,不多。

/*UI触摸事件管理器。原有cocos2dx带的触摸事件,每次监听要操作的步骤比較多,为此添加了一个事件管理器。来集中和简化管理
*/
#ifndef _X_TOUCH_EVENT_MANAGER_H_
#define _X_TOUCH_EVENT_MANAGER_H_
#include <cocos2d.h>
#include <cocos-ext.h>
#include <FastDelegate.h>
#include <xmap.h>
#include <xlog.h>
namespace zdh
{USING_NS_CC;USING_NS_CC_EXT;class XTouchEventManager : public CCObject{public://绑定的事件定义typedef fastdelegate::FastDelegate<void(gui::Widget *, gui::TouchEventType)> TTouchEvent;typedef int TagID_t;//一个Tag的触模事件结构,包含了四个事件struct STagEvent{TTouchEvent EventBegin;TTouchEvent EventMoved;TTouchEvent EventEnded;TTouchEvent EventCanceled;TTouchEvent * getByType(gui::TouchEventType paramType){switch (paramType){case gui::TOUCH_EVENT_BEGAN:return &EventBegin;case gui::TOUCH_EVENT_MOVED:return &EventMoved;case gui::TOUCH_EVENT_ENDED:return &EventEnded;case gui::TOUCH_EVENT_CANCELED:return &EventCanceled;}return nullptr;}//推断事件是不是都是为空bool isAllEmpty() const{return EventBegin.empty()&& EventEnded.empty()&& EventMoved.empty()&& EventCanceled.empty();}};//Tag事件映射表。能够换用std::maptypedef XMap<TagID_t, STagEvent> TEventMap;public:XTouchEventManager():m_UI(nullptr){}static XTouchEventManager * create(){XTouchEventManager * pRet = new XTouchEventManager();pRet->autorelease();return pRet;}//propertyvoid setUI(gui::TouchGroup * paramUI){m_UI = paramUI;}gui::TouchGroup * getUI(){return m_UI;}//绑定一个指定Tag和事件类型的事件TTouchEvent * Bind(TagID_t paramTagID, gui::TouchEventType paramType){if (!(paramType == gui::TOUCH_EVENT_BEGAN|| paramType == gui::TOUCH_EVENT_CANCELED|| paramType == gui::TOUCH_EVENT_ENDED|| paramType == gui::TOUCH_EVENT_MOVED))  return nullptr;int iIndex = m_Map.getIndexBykey(paramTagID);if (m_Map.isValidIndex(iIndex)){return m_Map.getValue(iIndex).getByType(paramType);}else{gui::Widget * pWidget = GetNodeByTag(paramTagID);if (isNULL(pWidget)) return nullptr;pWidget->addTouchEventListener(this, gui::SEL_TouchEvent(&XTouchEventManager::OnUITouch));return m_Map[paramTagID].getByType(paramType);}}//移除指定Tag和事件类型的侦听void RemoveListen(TagID_t paramTagID, gui::TouchEventType paramType){if (!(paramType == gui::TOUCH_EVENT_BEGAN|| paramType == gui::TOUCH_EVENT_CANCELED|| paramType == gui::TOUCH_EVENT_ENDED|| paramType == gui::TOUCH_EVENT_MOVED))  return;int iIndex = m_Map.getIndexBykey(paramTagID);if (m_Map.isValidIndex(iIndex)){auto pV = m_Map.getValue(iIndex);pV.getByType(paramType)->clear();if (pV.isAllEmpty())  //假设这个Tag全然没有事件侦听,那么就清除这个Tag的侦听{RemoveListen(paramTagID);}}}//移除指定Tag的侦听void RemoveListen(TagID_t paramTagID){gui::Widget * pWidget = GetNodeByTag(paramTagID);if (isNotNULL(pWidget)){pWidget->addTouchEventListener(nullptr, nullptr);}m_Map.RemoveByKey(paramTagID);}private://当UI被侦听的事件,被触发void OnUITouch(CCObject* paramSender, gui::TouchEventType paramType){gui::Widget * pUIControl = dynamic_cast<gui::Widget *>(paramSender);if (isNULL(pUIControl)) return;TagID_t tagID = pUIControl->getTag();STREAM_INFO << "Sender Tag=" << tagID << ", paramType=" << paramType;int iIndex = m_Map.getIndexBykey(tagID);if (m_Map.isValidIndex(iIndex)){auto pV = m_Map.getValue(iIndex);auto pEvent = pV.getByType(paramType);if (isNotNULL(pEvent) && (!pEvent->empty())){(*pEvent)(pUIControl, paramType); //调用事件}}}//取UI中指定Tag的widget对象gui::Widget * GetNodeByTag(TagID_t paramTag){if (isNULL(m_UI)) return nullptr;return m_UI->getWidgetByTag(paramTag);}private:gui::TouchGroup * m_UI;        //用Cocostudio UI编辑器。然后导入生成的UI对象TEventMap m_Map;         //事件侦听映射表};
}
#endif

使用样例:在Init函数

       m_EventManager = XTouchEventManager::create();m_EventManager->retain();gui::TouchGroup* ul = gui::TouchGroup::create();ul->addWidget(GUIReader::shareReader()->widgetFromJsonFile("MainUI_1.ExportJson"));this->addChild(ul, 2);m_EventManager->setUI(m_MainUI);

最后。事件绑定:

      m_EventManager->Bind(ET_BUTTON_EXIT, gui::TOUCH_EVENT_ENDED)->bind(this, &XSceneMain::OnExit);m_EventManager->Bind(ET_BUTTON_SAVE, gui::TOUCH_EVENT_ENDED)->bind(this, &XSceneMain::OnSave);

事件的定义:

   void XSceneMain::OnExit(gui::Widget * paramSender, gui::TouchEventType paramType){STREAM_INFO << "OnExit";}void XSceneMain::OnSave(gui::Widget * paramSender, gui::TouchEventType paramType){STREAM_INFO << "OnSave";}

依赖的代码參考:我的开发代码

[cocos2dx笔记010]用于UI的事件管理器相关推荐

  1. python异步框架twisted_详解Python的Twisted框架中reactor事件管理器的用法

    铺垫在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: 监听事件 事件发生执行对应的回调函数 回调完成(可能产生新的事件添加进监听队列) 回到1,监听事件 因此我们将这样的异步模式称为Reac ...

  2. [Unity] ACT 战斗系统学习 1:基于委托的事件管理器

    我觉得看视频太慢了,还是看别人源码更快-- 1.664235822/DarkSouls-Demo Github 源码: https://github.com/664235822/DarkSouls-D ...

  3. Angular 4.x 事件管理器及自定义EventManagerPlugin

    在 Angular 中如何为同一个表达式绑定多个事件呢?如果我们这样做可能会是这样的: <div><button (click, mouseover)="onClick() ...

  4. phalcon:model 事件与事件管理器

    事件与事件管理器(Events and Events Manager)¶ Models allow you to implement events that will be thrown when p ...

  5. 利用windows事件管理器定位程序闪退错误

    问题说明: 1.公司的硬件新加了一个相机模块 需要从相机中获取图片,用以计算屈光值. 根据相机厂家提供的头文件SnCam.h,SnCam.lib,SnCam.dll封装了一个类文件用以读取相机的图片. ...

  6. 疯狂Android讲义(二)——第二部分:第1组UI组件(布局管理器)

    一.第1组UI组件:布局管理器 Android 的界面组件比较多,不利于掌握它们内在的关系.为了帮助读者更好地掌握Android界面组件的关系,本书将会把这些界面组件按照它们的关联分析,分为几组进行介 ...

  7. Win 7 通过事件管理器查看计算机开机关机时间

    控制面板-管理工具-事件查看器 视图中开机来源:Kernel-General 事件ID:13 关机来源:Kernel-General 事件ID:12 转载于:https://www.cnblogs.c ...

  8. 事件管理器错误:来源DistributedCOM

    前言:windows10.事件查看器频繁捕捉到系统错误,遂查询下原因. 错误: 使用事件查看器查到错误如下: 应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 Lo ...

  9. 【Android笔记104】Android之壁纸管理器(WallpaperManager)的使用

    这篇文章,主要介绍Android之壁纸管理器(WallpaperManager)的使用. 目录 一.壁纸管理器(WallpaperManager) 1.1.壁纸管理器介绍

最新文章

  1. linux单体内核,加载Linux单体内核的笔记
  2. 电源空间辐射CDN余量低_EMI辐射整改
  3. 人人有奖 | 六一儿童节,大人也有礼品拿!
  4. centos mysql php tomcat_centos 一键部署安装nginx,mysql,php,apache,tomcat,redis等包合集
  5. nutch源代码阅读心得
  6. Android系统 (150)---Android 开发者工具
  7. [Swift]LeetCode46. 全排列 | Permutations
  8. Enum枚举 简单的使用
  9. 最新win11 JDK环境变量的配置
  10. 【PS】PS改变字体大小的方法
  11. 北大人工智能前沿讲座--第二讲 嵌入式人工智能
  12. 大话设计模式6—模板方法模式(考试抄题)
  13. matplotlib 3D绘图警告;MatplotlibDeprecationWarning: Axes3D(fig) adding itself to the figure is deprecate
  14. 如何在小程序内实现界面快速置顶功能?
  15. json转换成excel在线js小工具分享【不限制大小】
  16. 【Linux(一)】最新VMware虚拟机下载与安装
  17. 票房拐点之后的影院并购,继续“小而频”还是大洗牌
  18. #92 Backpack
  19. Ceph入门系列(一)
  20. 实时渲染:实时、离线、云渲染、混合渲染的区别

热门文章

  1. 典型关联分析CCA(canonical correlation analysis)
  2. UFLDL教程: Exercise: Sparse Autoencoder
  3. requestAnimationFram
  4. 记号一次更换IBM X3650M4主板后RAID无法启动的解决
  5. 数据库四大特性与隔离级别
  6. Python安装、使用MySQL数据库
  7. BestCoder Round #91 1001 Lotus and Characters
  8. 我之理解---计时器setTimeout 和clearTimeout
  9. Hadoop伪分布配置与基于Eclipse开发环境搭建
  10. 执行全文索引时出现权限不足的解决方法