cocos2dx 自定义事件
cocos2dx里Director類里有一個_eventDispatcher成員變量,_eventDisptacher的類型是EventDispatcher。
對于EventDispatcher,只要是這個類的對象發送(通過dispatchEvent發送)的事件(EventCustrom對象),該對象的監聽器(EventListenerCustom)就可以監聽(通過addEventListenerWithFixedPriority或者addEventListenerWithSceneGraphPriority監聽)到該事件。
這樣,對于項目中,不管什么地方,只要監聽該事件;然后不管什么地方,只要發送該事件,就可以直接調用得到。
比如:有三個按鈕,按第一個時,需要按鈕二和三高亮。
此時,可以按鈕二和三監聽一個事件,按鈕一發送該事件即可。
當然,也可以按鈕一擁有按鈕二和按鈕三的成員變量。
但是如果需求發生改變時,按鈕二沒有了,這時會影響到按鈕一,按鈕一的代碼就要改動,不符合程序設計的單一職責原則。
這種事件監聽和發送的機制就是程序設計模式中的一種。目的就是為了減少程序間的耦合性。
要知道,高內聚低耦合是程序設計的基本思想。
下面是實例代碼:
_listener = EventListenerCustom::create("game_custom_event", [=](EventCustom* event){std::string str("Custom event received, ");char* buf = static_cast<char*>(event->getUserData());str += buf;str += " times";statusLabel->setString(str.c_str()); });Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_listener, 1);auto sendItem = MenuItemFont::create("Send Custom Event", [=](Ref* sender){static int count = 0;++count;char* buf = new char[10];sprintf(buf, "%d", count);EventCustom event("game_custom_event");Director::getInstance()->getEventDispatcher()->dispatchEvent(&event);event.setUserData(buf);_eventDispatcher->dispatchEvent(&event);CC_SAFE_DELETE_ARRAY(buf); }); 上面的代碼是cocos2dx NewEventDispatcherTest中的代碼。其中做了一些改動,把原代碼中的_eventDispatcher改成了上面的Director::getInstance()->getEventDispatcher()。
cocos2dx里的Node類有一個_eventDispatcher成員變量,所以Node的子類也有。原代碼中的_eventDispatcher就是這樣一個變量,其實_eventDispatcher根本上就是Director::getInstance()->getEventDispatcher(),大家可以跟著原代碼查看一下。
但是我個人覺得Node里的會讓人產生歧義,會讓人覺得只有Node里才有事件管理器,而沒有全局的事件管理器。
總結
以上是生活随笔為你收集整理的cocos2dx 自定义事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle问题imp-10019:由于
- 下一篇: 云脉文档管理系统高效管理海量纸质文档