ipad上,可以用五指抓取,把应用关闭,相当于home的作用,但是如果是抓取缩小,但不完全关闭,再放大,那么应用就会恢复。
但是在cocos2dx的游戏应用中,有时就会无响应,应用在跑,但是点击什么都没反应。
一路追下来(人家追的,我是受益者。。。又获取了人家的点子),发现在CCEGLViewProtocol这个文件,有如下定义:
static CCTouch* s_pTouches[CC_MAX_TOUCHES] = { NULL }; unsigned int s_indexBitsUsed = 0; /***** 就是他 *****/ static CCDictionary s_TouchesIntergerDict; static int getUnUsedIndex() { int i; int temp = s_indexBitsUsed; for (i = 0; i < CC_MAX_TOUCHES; i++) { if (! (temp & 0x00000001)) { s_indexBitsUsed |= (1 << i); return i; } temp >>= 1; } // all bits are used return -1; } static void removeUsedIndexBit(int index) { if (index < 0 || index >= CC_MAX_TOUCHES) { return; } unsigned int temp = 1 << index; temp = ~temp; s_indexBitsUsed &= temp; }
在五指抓取过后,这个值不会归0,然后就导致后面的点击不会被响应。
但是,这个地方的上限只有5点,大于5点的多点触控是怎么搞的我不知情,放着以后研究。估计正常人也用不到大于5点的多点
提供一种解法,在appdelegate里面做如下修改:
NS_CC_BEGIN extern unsigned int s_indexBitsUsed; NS_CC_END void AppDelegate::applicationWillEnterForeground() { s_indexBitsUsed=0; /****** here ****/ CCDirector::sharedDirector()->startAnimation(); if(CocosDenshion::SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying())// 如果正在播放则恢复 CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeAllEffects(); }
其实就是手动重置而已,因为他是个全局变量。
FYI:我看这一段的时候还乌了个龙,找了N久,都只发现了get和remove,没找到set在哪,找了N久,才发现get的时候就自加1了。。。真惭愧
忘记说了,原来的代码里面,这个变量是static的,static的全局变量,是限制了只能在此文件访问,所以要去掉static属性,上面的代码是已经改过之后的