0

iPhone シミュレーターでエラーが発生することなく、このコードを実行できました。ただし、iPhone で実行すると、EXC_BAD_ACCESS エラーが発生します。コードは次のとおりです。

        CCAnimate * explosionAnimate = CCAnimate::create(explosionAnimation);
        CCCallFuncN * callFuncN = CCCallFuncN::create(this,callfuncN_selector(GameLayer::removeChildFromParent));
        CCFiniteTimeAction * explosionSequence = CCSequence::create(explosionAnimate, callFuncN);

        CCSprite * explosionSprite = CCSprite::createWithSpriteFrameName("explosion_frame_1");
        addChild(explosionSprite);

        explosionSprite->setPosition(point);
        explosionSprite->runAction(explosionSequence);
    }

    void GameLayer::removeChildFromParent(CCNode * child)
    {
        child->removeFromParent();
    }

エラーは、CCSequence::create(...) が呼び出されたときに発生します。CCSequence::create(...) によるデバッグ

CCFiniteTimeAction* CCSequence::create(CCFiniteTimeAction *pAction1, va_list args)
{
    CCFiniteTimeAction *pNow;
    CCFiniteTimeAction *pPrev = pAction1;

    while (pAction1)
    {
        pNow = va_arg(args, CCFiniteTimeAction*);
        if (pNow)
        {
            pPrev = createWithTwoActions(pPrev, pNow);
        }
        else
        {
            break;
        }
    }

    return pPrev;
}

「createWithTwoActions」が 2 回呼び出されていることがわかります。それは正しくないようです。「createWithTwoActions」への 2 回目の呼び出し。エラーは CCFiniteTimeAction 内、特に getDuration() インライン関数で発生します。

inline float getDuration(void) { return m_fDuration; }

なぜこれが発生するのでしょうか?

4

1 に答える 1

4

次のように CCSequence::create() を呼び出すことで問題を解決できました。

CCSequence::create(explosionAnimate, callFuncN, NULL);

それ以外の:

CCSequence::create(explosionAnimate, callFuncN);

これは、CCFiniteAction ポインターと C++ 可変長引数の性質に関係していると推測しています。

于 2013-02-17T18:59:09.570 に答える