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函數。可是不建議這么做,這樣做之后全部的事件監聽器都不再響應。
好了,這篇主要講了事件觸摸機制,在下一篇中講一下加速計事件。