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