cocos2d-x多點觸控和單點觸控同用實現
阿新 • • 發佈:2019-02-13
有時遊戲中有的介面要使用單點觸控,有的介面要使用多點觸控,但是單點和多點又不能同時註冊,因為同時註冊時,單點觸控的優先順序高於多點觸控,所以會響應單點觸控,多點觸控被遮蔽。
因為在寫遊戲的時候自定義層的基類中是註冊了單點觸控,所以每個繼承該基類的層都會有單點觸控響應,然後在遊戲中就會出現問題。
註冊單點觸控:
.h檔案
//單點觸控 EventListenerTouchOneByOne * listener; virtual void registerTouch(); virtual bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event); virtual void onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *unused_event); virtual void onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *unused_event);
.cpp檔案
void LayerBase::registerTouch() { auto dispatcher = Director::getInstance()->getEventDispatcher(); listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(LayerBase::onTouchBegan, this); listener->onTouchMoved = CC_CALLBACK_2(LayerBase::onTouchMoved, this); listener->onTouchEnded = CC_CALLBACK_2(LayerBase::onTouchEnded, this); listener->setSwallowTouches(true);//先預設不穿透 dispatcher->addEventListenerWithSceneGraphPriority(listener, this); }
註冊多點觸控:
.h檔案
//多點觸控 EventListenerTouchAllAtOnce *_listener; void registerTouches(); void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event); void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event); void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event);
.cpp檔案
以為當前層基層了layerBase,所以也有單點觸控,為了只使用多點觸控,所以在註冊多點觸控的時候直接將之前的單點觸控事件移除就好。
void GameRun::registerTouches()
{
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->removeEventListener(listener); //這裡因為是隻使用多點觸控,所以將單點觸控刪除
_listener = EventListenerTouchAllAtOnce::create();
_listener->onTouchesBegan = CC_CALLBACK_2(GameRun::onTouchesBegan, this);
_listener->onTouchesMoved = CC_CALLBACK_2(GameRun::onTouchesMoved, this);
_listener->onTouchesEnded = CC_CALLBACK_2(GameRun::onTouchesEnded, this);
dispatcher->addEventListenerWithSceneGraphPriority(_listener, this);
}
嚴謹考慮,在層中的onExit函式中要將註冊的觸控事件從事件分發器中移除:
//移除事件監聽
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->removeEventListener(_listener);
注意:多點觸控那個相應函式的返回值型別都是void,單點觸控的onTcouhBegin的返回值型別為bool。