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


                
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值