切换CCAnimations时EXC_BAD_ACCESS

时间:2012-06-03 14:59:09

标签: objective-c cocos2d-iphone exc-bad-access

我刚开始在cocos2D中使用CCAnimations,我遇到了一个我很难解决的问题。

我正在制作一个基本的平台游戏,玩家精灵有各种动画需要根据玩家的状态运行。

我在图层的init方法中有以下代码:

sprite = [CCSprite spriteWithSpriteFrameName:@"stand.png"];

standingSprites = [NSArray arrayWithObjects:
                   [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"stand.png"],
                   nil];
runningSprites = [NSArray arrayWithObjects:
                   [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"run1.png"],
                   [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"run2.png"],
                   nil];

standingAnimation = [CCAnimation animationWithFrames:standingSprites delay:0.2f];
runningAnimation = [CCAnimation animationWithFrames:runningSprites delay:0.2f];
animationAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:standingAnimation]];
[sprite runAction:animationAction];

这与两个动画中的任何一个都可以正常工作。但是,我想在玩家静止时运行standingAnimation并在玩家运行时runningAnimation运行。我尝试按如下方式执行此操作:

-(void)walk {

    if(!isWalking) {
        isWalking = true;
        [sprite stopAction:animationAction];
        animationAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:runningAnimation]];
        [sprite runAction:animationAction];
    }
}

第二行到最后一行会导致程序崩溃,从而导致EXC_BAD_ACCESS(在引用0x0时)。单步执行调试器中的walk,似乎没有任何相关指针为空。

从堆栈跟踪:

2012-06-03 10:59:59.907 ThirtyMinutes[9876:6403] *** Terminating app 
due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[NSCTFontDescriptor frames]: unrecognized selector sent to instance 
0x7f808d93e9f0'

0x7f808d93e9f0runningAnimation的地址。

  1. 我做错了什么?
  2. 有更好的方法吗?
  3. 谢谢!

2 个答案:

答案 0 :(得分:2)

错误消息告诉您,在错误发生时,0x7f808d93e9f0是NSCTFontDescriptor对象的地址。可能的原因是你没有保留runningAnimation并且已经为不同的对象回收了它的记忆。

(显示runningAnimation的声明,如果它不明显是如何发生的话。)

答案 1 :(得分:0)

每次要使用它们时都必须重新创建操作。在您的情况下,您尝试在取消分配后使用操作。