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属性,上面的代码是已经改过之后的