1. 程式人生 > >cocos2d-x多點觸控和單點觸控同用實現

cocos2d-x多點觸控和單點觸控同用實現

    有時遊戲中有的介面要使用單點觸控,有的介面要使用多點觸控,但是單點和多點又不能同時註冊,因為同時註冊時,單點觸控的優先順序高於多點觸控,所以會響應單點觸控,多點觸控被遮蔽。

    因為在寫遊戲的時候自定義層的基類中是註冊了單點觸控,所以每個繼承該基類的層都會有單點觸控響應,然後在遊戲中就會出現問題。

註冊單點觸控:

.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