大佬教程收集整理的这篇文章主要介绍了cocos2dx 3.2 解决触摸事件中两个按钮同时响应的问题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
上篇触摸机制讲解中提到过存在两个按钮同时响应的问题。
我们一般使用EventListenerTouchOneByOne注册触摸事件,但是这里的触摸消息是按顺序依次响应的,当你在屏幕中同时点击了两个按钮(A和B),彼此没有交集,触摸机制会依次触发两次触摸消息,一次按钮A的触摸消息,另一次按钮B的触摸消息。重要的是依次触发消息,每次触摸消息都会执行按钮A和按钮B的回调函数,根据回调函数里面的区域判断当前的触摸消息点击到了哪个按钮。这样按钮A和按钮B的回调函数会各执行两次,即使对每个按钮设置setSwallowTouches(true),也只对点击到按钮的那次触摸消息有作用。因为SetSwallowTouches只在onTouchBegan返回true的时候才生效。假设按钮A的触摸优先级高,当处理按钮A的触摸消息时,区域判断返回true,触摸会被吞噬,按钮B不会被触发,但是处理按钮B的触摸消息时,按钮A的区域判断失败,setSwallowTouches不会执行,接着执行按钮B的回调函数。因此,两个按钮同时响应了。再提一点是,android上面是这样的,但是ios上,是不会同时响应两个按钮,这个可能跟操作系统有关吧。。
@H_318_4@menu的实现方式引擎中的Menu类已经对这种情况做了处理,可以参考一下如何下代码,具体思路是在触摸回调中加入一个状态的判定。开始处理一个触摸消息后,在执行onTouchBegan后,一直到onTouchEnd结束调用之前,禁用其他按钮的触摸。
bool Menu::onTouchBegan(Touch* touch,Event* event) { if (_state != Menu::State::WAITinG || ! _visible || !_enabled) { return false; } for (Node *c = this->_parent; c != nullptr; c = c->getParent()) { if (c->isVisible() == falsE) { return false; } } _SELEctedItem = this->getItemForTouch(touch); if (_SELEctedItem) { _state = Menu::State::TRACKING_TOUCH; _SELEctedItem->SELEcted(); return true; } return false; } void Menu::onTouchEnded(Touch* touch,Event* event) { CCassERT(_state == Menu::State::TRACKING_TOUCH,"[Menu ccTouchEnded] -- invalid state"); this->retain(); if (_SELEctedItem) { _SELEctedItem->unSELEcted(); _SELEctedItem->activate(); } _state = Menu::State::WAITinG; this->release(); }_state 变量就是为了防止按钮同时响应的状态变量,如果当前有按钮不是处在Menu::State::WAITinG状态时,就说明有按钮正在响应,不处理当前的触摸消息。但是,这同样会引入一个问题,当一个scene的不同layer中有多个menu呢,那也会导致处于不同的menu的按钮同时响应。规避办法就要看开发者如何设计了,又或者一个scene共同一个menu。。
class ButtonManager; static ButtonManager* m_instance = nullptr; class ButtonManager { public: ButtonManager(); ~ButtonManager(); static ButtonManager* geTinstance() { if (!m_instancE) { m_instance = new ButtonManager(); } return m_instance; } static void release() { if (m_instancE) { delete m_instance; m_instance = nullptr; } } private: CC_SYNTHESIZE(bool,m_bIsClickEnable,IsClickEnablE); private: std::vector<WWButton*> m_allButtons; };很简单的buttonManager类,都不需要cpp文件,根据m_bIsClickEnable变量来判断当前按钮状态即可。
bool WWButton::onTouchBegan(cocos2d::Touch *touch,cocos2d::Event *unused_event) { if (!m_bEnablE) { return false; } if (!ButtonManager::geTinstance()->getIsClickEnable()) { return false; } if (!containTouch(touch)) { return false; } ButtonManager::geTinstance()->setIsClickEnable(false); return true; } void WWButton::onTouchEnded(cocos2d::Touch *touch,cocos2d::Event *unused_event) { ButtonManager::geTinstance()->setIsClickEnable(true); }WWButton是一个按钮基类,只要继承此类,扩展的子类都不用担心按钮同时响应的问题。
以上是大佬教程为你收集整理的cocos2dx 3.2 解决触摸事件中两个按钮同时响应的问题全部内容,希望文章能够帮你解决cocos2dx 3.2 解决触摸事件中两个按钮同时响应的问题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。