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
    }
}

また、これを呼び出す前に spriteFrameCache に .plist とテクスチャを実際にロードしたこと、および実行ループの他の場所のキャッシュから UnusedSpriteFrames を削除しないことを確認できますか。

于 2012-04-24T17:04:38.260 に答える