【问题标题】:My spriteSheet animation crashes my app我的 spriteSheet 动画使我的应用程序崩溃
【发布时间】:2012-04-24 08:36:38
【问题描述】:

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

【问题讨论】:

  • 什么样的崩溃?控制台的输出是什么?
  • 我不知道,因为我总是有一个错误 no enough frames in stack 所以我看不到控制台中有什么:/

标签: iphone xcode animation crash cocos2d-iphone


【解决方案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) 在代码中添加 NSLog 跟踪以查看执行的内容和未执行的内容(这样可以缩小潜在原因的范围); 2)尝试注释掉你的代码片段(一次一个),看看它是否变得更好(这样,你就找到了罪魁祸首)。如果调试器不工作,这些是我看到的唯一选项。还可以在 Xcode 管理器中查看设备日志,看看是否找到崩溃报告...
  • 我实际上忘记将 CCAnimation 放入 CCAnimate - 你的答案对我来说很清楚。
【解决方案2】:

我在代码中唯一能看到的是您的 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。

【讨论】:

    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2013-08-20
    相关资源
    最近更新 更多