有时游戏中有的界面要使用单点触摸,有的界面要使用多点触摸,但是单点和多点又不能同时注册,因为同时注册时,单点触摸的优先级高于多点触摸,所以会响应单点触摸,多点触摸被屏蔽。
因为在写游戏的时候自定义层的基类中是注册了单点触摸,所以每个继承该基类的层都会有单点触摸响应,然后在游戏中就会出现问题。
注册单点触摸:
.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。