[cocos2dx笔记010]用于UI的事件管理器

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";}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异形3×3魔方还原教程_【理论篇】三阶魔方4.33千亿亿种变化是怎么计算出来的?...

本篇文章主要介绍三阶魔方总状态数是如何计算出来的&#xff0c;并介绍了两种算法&#xff0c;尽量保证语言通俗易懂&#xff0c;不涉及高深的理论知识&#xff08;当然我也不懂&#xff1a;P&#xff09;一、4.33千亿亿到底有多大&#xff1f;我们都知道三阶魔方的总变化状态数…

Jquery 对话框确认

$("#aa").click(function(){if(confirm("是否继续")){$(#aa).fadeOut(500);} }) 转载于:https://www.cnblogs.com/chen-lhx/p/5149469.html

datazen Active Directory AD 配置

今天苦心经营的datazen 链接AD&#xff0c;文档已经无法吐槽了简单的几句话&#xff0c;根本不够用。 先说一下链接AD 的好处吧&#xff0c; 1 首先免去设置密码的麻烦&#xff0c;因为直接用AD账号的密码。 2 更安全&#xff0c;因为客户可不想自己的自己的系统&#xff0c;开…

Android CardView卡片布局 标签: 控件

CardView介绍 CardView是Android 5.0系统引入的控件&#xff0c;相当于FragmentLayout布局控件然后添加圆角及阴影的效果&#xff1b;CardView被包装为一种布局&#xff0c;并且经常在ListView和RecyclerView的Item布局中&#xff0c;作为一种容器使用。CardView应该被使用在显…

橱柜高度与身高对照表_下一套房子装修,橱柜就照这样打,布局尺寸这么详细,不信不好用...

闲在家的时候&#xff0c;动手给自己做一顿色香味俱全的美食&#xff0c;是一个享受的过程。享受的&#xff0c;不仅仅是味蕾的体验&#xff0c;择菜、洗菜、切菜、下锅...每一个环节都是。不过&#xff0c;这取决于你是否有一个好厨房&#xff1b;而厨房最最最重要的家具&…

DOSbox汇编集成环境下的具体设置

altenter能够全屏幕&#xff0c;假设认为游戏执行速度不合适&#xff0c;能够改动 cycles3000 。将3000适当调整大小。 3。执行 DOSBox&#xff0c;会打开两个 DOS 窗体。我们仅仅需在例如以下窗体中键入 mount c h:\pal 此命令的作用为将 h:\pal 挂载为 C 盘&#xff0c;h:\p…

.NET手记-JS获取Url参数

最近为App做活动专区&#xff0c;其中很多活动都是采用html 5页面来制作的。一方面体量较小&#xff0c;制作快速&#xff0c;更新维护容易&#xff1b;另一方面&#xff0c;嵌入App后适配效果也不会很差。 这里我们采用混编形式来从native app传参给web页面&#xff0c;我们采…

Entity Framework系列之DataBase First

第一步 新建数据库和表 USE [TestDB] GO /****** Object: Table [dbo].[T_User] Script Date: 01/14/2015 20:27:52 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T_User]([Id] [int] IDENTITY(1,1) NOT NULL,[Name] [nvarchar](50) NUL…

axios打包放到服务器上接口地址404_如何把网页文件放到云虚拟主机

把网页文件放到云虚拟主机上&#xff0c;可以用虚拟主机控制面板、FTP软件等方式。我们在运营网站时&#xff0c;经常需要制作一些特殊网页文件&#xff0c;比如404页面、sitemap页面、robots文件等&#xff0c;以及像站长平台严重文件、统计代码验证文件等&#xff0c;这些页面…

cisco数据中心理论小记-3

port channelSTP-防环,非根非指定口block.PCH-带宽利用率提升&#xff0c;逻辑上单链路 l2/l3都可以使用passive -LACP /active-Lacp/ on-Static无协议-on有协商-LACPneuxs 不支持PACPvPC---纯二层 技术&#xff0c;没有三层功能vitrual Port channel解决的是跨框 &#xff0c;…

-----------最小生成树----------------

最小生成树(Minimum Spanning Tree) 1:是一棵树(是一种特殊的图) 连通的,没有回路 有V 个顶点 一定有 V-1条边 2:生成树 包含了全部的顶点,所有的V-1条边 都在图里 剩下的三个土 都是第一个完全图的生成树 只要是 4个顶点 3条边 没有回路 就是生成树 这3个图 随便的加一…

jQuery Easing 使用方法及其图解

从jQuery API 文档中可以知道&#xff0c;jQuery自定义动画的函数.animate( properties [, duration] [, easing] [, complete] )有四个参数&#xff1a; properties&#xff1a;一组包含作为动画属性和终值的样式属性和及其值的集合duration(可选)&#xff1a;动画执行时间&am…

可以进行单元测试么_前端与单元测试

先来几个专业词汇&#xff0c;这样显得高大上一点&#xff08;不存在的。&#xff09;BDD: Behavior-Driven Development (行为驱动开发)TDD: Test-Driven Development (测试驱动开发)ATDD: Acceptance Test Driven Development(验收测试驱动开发)好&#xff0c;说完了&#xf…

UWP--页面传值

//匿名对象private void Button1_OnClick(object sender, RoutedEventArgs e){this.Frame.Navigate(typeof(PageNavigate2), new { id 1, name "LBI" });}//利用反射获取protected override void OnNavigatedTo(NavigationEventArgs e){var parameter e.Parameter…

Android 4.4 KitKat, the browser and the Chrome WebView

Having V8 as the JavaScript engine for the new web view, the JavaScript performance if much better, besides general performance on CSS thanks to hardware acceleration Android 4.4 KitKat, the browser and the Chrome WebView转载于:https://www.cnblogs.com/dais…

excel 行高 上下留白_拒绝加班,工作中最常用的57个Excel小技巧来了!

今天高顿君分享的 Excel小技巧&#xff0c;全是工作是最常用且简单易操作的&#xff0c;共57个&#xff0c;希望对同学们有所帮助。&#xff08;适合版本 Excel2007及以上&#xff09;一、文件操作1、为excel文件添加打开密码文件 - 信息 - 保护工作簿 - 用密码进行加密。2、为…

经验分享:三步走教你升级企业NAS设备

前几年凡是对于数据存储有需求的企业都已经购买了相关的NAS产品&#xff0c;不过电脑和网络升级换代是比较频繁的&#xff0c;几年过去了中小企业对数据存储的需求也水涨船高&#xff0c;然而面对当初的NAS存储设备该如何处理呢&#xff1f;扔掉可惜使用又不如意的鸡肋问题能够…

C#索引器

索引器允许类或者结构的实例按照与数组相同的方式进行索引取值&#xff0c;索引器与属性类似&#xff0c;不同的是索引器的访问是带参的。 索引器和数组比较&#xff1a; (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 (3)索引器不是一个变量 索引器和属性的不同点 …

获取访客进站关键词_拼多多访客突然下降是为什么?拼多多访客突然暴涨又是怎么回事?...

在当下这个互联网时代&#xff0c;可以说流量就代表这金钱。这一点在做电商的商家那里表现的就更为直观了&#xff0c;如果你做了一个拼多多的店铺&#xff0c;之前店铺的流量一直都比较好&#xff0c;而现在拼多多店铺的流量忽然下降了&#xff0c;那么店铺中的销售额就会受到…

微信开发之 二维码生成类库

最近weiphp 二次开真的有点累&#xff0c;漏洞百出。代码维护代价有点高。 <?php /*** Created by PhpStorm.* User: bin* Date: 15-1-16* Time: 上午9:48*/ namespace Home\Common;// 微信处理类 set_time_limit(30); class Weixin{//构造方法static $qrcode_url "h…