现在的位置: 首页 > 综合 > 正文

cocos2dx ipad 五指缩小再放大后,应用无响应

2017年12月21日 ⁄ 综合 ⁄ 共 1341字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.