1

所以我每秒都在创建一个精灵,但现在我想用 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]];
}
4

2 回答 2

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];
于 2012-04-24T08:43:12.733 回答
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。

于 2012-04-24T17:04:38.260 回答