[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.pswp.cn/news/257777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257777.shtml
英文地址,請注明出處:http://en.pswp.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…