大家觉不觉的cocos2d的touch处理有危险

对于触摸,系统接收到,就马上通知给cocos2d的touchDispatcher, 然后分派处理。 ios上感觉不出来,android上表现就很明显了:如果你眼疾手快,对一个按钮很快的点击多次,如果这个按钮处理速度很慢(如加载场景然后跳转过去), 这就导致会加载多次场景。 对于某些处理,可能会引起崩溃。
这可能是系统touch接收,和cocos2d不是同一个线程造成的。导致如果一帧处理动作有点长,这一帧内可能收到多次触摸,造成多次点击一个按钮的事件发生。

这种情况在IOS上面也是存在的,你自己要在代码逻辑里面加判断。如果是一些只能执行一次的代码,你要加flag进行判断,防止重复点击

这个问题以前没大注意,以后要小心了

学习了,我也遇到这种情况了,连续快速点击按钮,程序崩溃…

— Begin quote from ____

andyque 发表于 2012-4-22 11:23 url

这种情况在IOS上面也是存在的,你自己要在代码逻辑里面加判断。如果是一些只能执行一次的代码,你要加flag …

— End quote

版主,如果两个图层的按钮有叠加部分怎么处理?按叠加区域,哪个按钮都不执行,能设置优先级??

这种问题应该是程序逻辑处理,不是引擎的责任。

对于一个按钮,点击后,需要立即禁用这个按钮和当前场景的所有其他按钮。避免重复点击。
或者在按钮生效后,禁用触摸事件。

我也遇到这样的情况,,,所以重写了按钮的时间处理。。小于200ms的点击就不算是合法的。

习惯使用状态机的飘过~~~从根本上杜绝这种隐患

我干脆在cocos2d的一个step里处理上个step到这个step中间所有点击的最后一个点击。 只能这样凑活着了

mark~~~~~~~~~~~~~~~~~~~
感觉状态机才是王道

— Begin quote from ____

月神天 发表于 2012-5-2 18:05 url

习惯使用状态机的飘过~~~从根本上杜绝这种隐患

— End quote

求教使用状态机的具体做法

— Begin quote from ____

shegndoushi 发表于 2012-6-29 11:36 url

求教使用状态机的具体做法

— End quote

void changeStateTo(int state)
{
int oldState = this->state;
this->state = state;
this->processStateChanged(oldState, state);
}

void processStateChanged(int oldValud, int newValue)
{
switch(oldValue){
case XX:
//销毁原状态
break;
}
switch(newValue){
case XX:
//启动新状态
break;
}
}

在触摸的时候调用changeStateTo(xxx)就行了

— Begin quote from ____

月神天 发表于 2012-6-29 13:40 url

void changeStateTo(int state)
{
int oldState = this->state;

— End quote

哦, 原来如此,谢谢了

— Begin quote from ____

shegndoushi 发表于 2012-7-5 13:21 url

哦, 原来如此,谢谢了

— End quote

触摸的时候也是根据状态机进行触摸逻辑的判定的
触摸逻辑里也要写一个
switch(state){
case …
changeStateTo(xxx);
break;
}

这样,触摸的一瞬间完成了状态转换,就完全杜绝了多次触摸的危险。