cocos2d-x 事件分發機制 ——觸摸事件監聽


cocos2d-x 3.0 出來已經好久了,也已經用3.0寫了幾個小游戲,感覺3.0的事件觸發機制太贊了,隨這里總結一下。也算是對知識的一種回顧和加深理解。

3.0的事件分發機制中。須要也只須要通過創建一個事件監聽器來實現各種觸發后的邏輯,然后加入到事件分發器_eventDispatcher。全部的事件監聽器由這個分發器統一管理,就可以完畢事件響應。

事件監聽器有下面幾種:

1、EventListenerTouch(觸摸事件)

2、EventListenerKeyboard(鍵盤響應事件)

3、EventListenerMouse(鼠標響應事件)

4、EventListenerAcceleration(加速記錄事件)

5、EventListenerCustom(自己定義事件)


_eventDispatcher的工作由三部分組成:

1、事件分發器EventDispatcher

2、事件類型EventTouch,EventKeyboard,等

3、事件監聽器(上面列舉的五種)

監聽器實現各種觸發后的邏輯,事件分發器來分發全部注冊的事件,然后調用響應的類型監聽器來響應事件。


這篇來講一下游戲中用的最多的觸摸事件監聽EventListenerTouch

3.0中的觸摸監聽變得很easy,僅僅須要注冊響應的事件監聽器,給事件監聽器的各個響應函數賦予響應的回調函數,最后將實現的事件監聽器注冊到事件分發器_eventDispatcher中。實現各個回調函數的邏輯功能就可以。

第一步:穿件事件監聽器,並注冊到時間分發器中,這一步最好在onEnter()函數中實現。

//觸摸響應注冊
auto touchListener = EventListenerTouchOneByOne::create();//創建單點觸摸事件監聽器
touchListener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan,this);//觸摸開始
touchListener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved,this);//觸摸移動
touchListener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded,this);//觸摸結束
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,this;//注冊分發器

第二步:實現上述監聽器中的三個回調函數

bool GameLayer::onTouchBegan(Touch* touch, Event* event) {
	//實現自己的邏輯代碼
	return true;
}

void GameLayer::onTouchMoved(Touch* touch, Event* event) {
	//實現自己的邏輯代碼
}

void GameLayer::onTouchEnded(Touch* touch, Event* event) {
//實現自己的邏輯代碼
}
onTouchBegan()函數中返回true,則響應事件不會向下層傳遞,僅僅會響應本層中的Began、Moved、Ended三個函數,假設返回false,則本層興許的Moved、Ended函數不會被觸發,可是事件會向下層傳遞。

同一時候能夠在注冊響應事件時,用

touchListener->setSwallowTouches(true);//不向下傳遞觸摸
來設置是否向下傳遞觸摸事件。

_eventDispatcher是Node的屬性,通過它管理當前節點(場景、層、精靈等)的全部事件的分發。它本身是一個單例模式的引用。在Node的構造函數中。通過Director::getInstance()->getEventDispatcher();獲取。

當一個事件監聽器須要反復利用時。須要用clone()方法創建一個新的克隆。由於在使用addEventListenerWithSceneGraphPriorith或者addEventListenerWithFixedPriority方法進行注冊時。會對當前使用的事件監聽器加入一個已注冊的標記,這使得它不可以被加入多次。

另外。再使用FixedPriority listeners時,加入完之后須要手動remove,SceneGraphyPriority listener和Node綁定,在Node的析構函數中會被移除。

移除一個已注冊的監聽器用

_eventDispatcher->removeEventListener(listener);
也能夠直接調用removeAllListeners函數。可是不建議這么做,這樣做之后全部的事件監聽器都不再響應。


好了,這篇主要講了事件觸摸機制,在下一篇中講一下加速計事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM