我的spriteSheet动画崩溃了我的应用程序

时间:2012-04-24 08:36:39

标签: iphone xcode animation crash cocos2d-iphone

所以我每秒都在创建一个精灵,但现在我想用spriteSheetAnimation替换这个精灵。但当我运行此代码时,我的应用程序崩溃了:

- (void)spawnCat {
    CCSpriteBatchNode *spriteSheet2 = [CCSpriteBatchNode batchNodeWithFile:@"AnimBulle.png"];
    [self addChild:spriteSheet2];

    // Load up the frames of our animation
    NSMutableArray *walkAnimFrames = [NSMutableArray array];
    for(int i = 1; i <= 8; ++i) {
        [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"AnimBulle%d.png", i]]];
    }
    CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames
                                                       delay:0.1f];
    [target runAction:_walkAction];
    target.tag = 1;
    [_targets addObject:target];

    [self addBoxBodyForSprite:target];
    [spriteSheet2 addChild:target z:0 tag:1];
    id actionMove = [CCMoveTo actionWithDuration:actualDuration 
                                        position:ccp(240, 160)];
    id actionMoveDone = [CCCallFuncN actionWithTarget:self 
                                             selector:@selector(spriteDone:)];
[target runAction:[CCSequence actions:actionMove, actionMoveDone, nil]];
}

2 个答案:

答案 0 :(得分:1)

编辑: 从你得到的那种错误(没有足够的堆栈跟踪),你有一个无限的递归(即一种最终直接或间接调用自身的方法)。 spawnCat中的代码似乎不需要这样的无限递归,所以问题必定在其他地方。

你如何致电spawnCat?你可以在创建动画的方法中加入一些NSLog跟踪,这样你就可以看到有人一直在调用自己吗?

原始答案: 你确定这就是你的意思吗?

CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.1f];
[target runAction:_walkAction];

我看不到_walkAction初始化,但我希望你在创建动画之后通过执行以下操作来执行

CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.1f];
_walkAction = [CCAnimate actionWithAnimation:walkAnim];
[target runAction:_walkAction];

答案 1 :(得分:0)

我能在代码中看到的唯一一件事就是找不到你的spriteFrame。当您尝试将nil添加到数组时,您可能会得到令人讨厌的结果。我会修改循环如下(记录帮助)。

for(int i = 1; i <= 8; ++i) { 
    NSString *sfn = [NSString stringWithFormat:@"AnimBulle%d.png", i];
    CCSpriteFrame *sf = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:sfn];
    if(sf) {
        [walkAnimFrames addObject:sf];
    } else {
        CCLOGERROR(@"%@<spawnCat> : *** Sprite frame named [%@] not found in cache, bailing out.",self.class,sfn);
        return; // ok here, nothing is retained before this may be executed
    }
}

另外,在调用此方法之前,您是否可以确保实际使用.plist和纹理加载spriteFrameCache,并且不要在运行循环中的其他位置从缓存中删除UnusedSpriteFrames。