日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cocos2d-x 3.2 EventDispatcher事件分发机制

發布時間:2024/1/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cocos2d-x 3.2 EventDispatcher事件分发机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉載于Cocos2d-x v3.2學習筆記中的(九)事件分發機制(EventDispatcher)

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

鍵盤事件

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

?

鼠標事件

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

?

自定義事件

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

?

加速器事件

除了觸摸,移動設備上一個很重要的輸入源是設備的方向,因此大多數設備都配備了加速計,用于測量設備靜止或勻速運動時所受到的重力方向。

?

重力感應來自移動設備的加速計,通常支持X,Y和Z三個方向的加速度感應,所以又稱為三向加速計。在實際應用中,可以根據3個方向的力度大小來計算手機傾斜的角度或方向。

?

加速計監聽器EventListenerAcceleration,其靜態create方法中有個Acceleration的參數。Acceleration是一個類,包含了加速計獲得的3個方向的加速度。

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

?

示例代碼

EventDispatcherTest.h

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

?

EventDispatcherTest.cpp

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

?

推薦閱讀:

【官方文檔】事件分發機制

轉載于:https://www.cnblogs.com/dudu580231/p/4565779.html

總結

以上是生活随笔為你收集整理的Cocos2d-x 3.2 EventDispatcher事件分发机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。