我正在尝试创建一个名为Enemy
的CCSprite子类#import "Enemy.h"
@implementation Enemy
{
CCSprite* ant;
CCAnimation *walkAnim ;
}
-(id)init
{
self = [super init];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"char.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"char.png"];
[self addChild:spriteSheet];
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for (int i=1; i<=3; i++) {
[walkAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:@"antNormal_%d.png",i]]];
}
walkAnim = [CCAnimation animationWithSpriteFrames:walkAnimFrames delay:0.1f];
self = [CCSprite spriteWithSpriteFrameName:@"antNormal_1.png"];
CCAction* walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim]];
[self runAction:walkAction];
return self;
}
@end
然后在我的游戏玩家中我添加了像这样的敌人
enemies=[[CCArray alloc] initWithCapacity:100];
for (int i=0; i<10; i++) {
Enemy* ant=[[Enemy alloc] init];
[ant setPosition:ccp(100*i,100)];
[enemies addObject:ant];
}
但是这导致程序在错误开始时崩溃
'NSInternalInconsistencyException', reason: 'Animate: argument Animation must be non-nil'
如果我注释掉CCAction,敌人会正确显示,只是没有动画(显然)。目前还不确定如何解决这个问题。
答案 0 :(得分:1)
虽然我不能专门与Cocos2d交谈,但是从ObjC的角度来看,你的init
方法中存在一些可能导致问题的错误。
self
自设两次。第二个创建了类的新实例,并破坏了旧实例。您应该只将self设置为init
方法的结果,而不是类工厂方法self
未检查为零。在设置任何ivars之前,您应该始终检查self
是否为 。如果您调用的init
方法失败,if将为nil,您的应用将崩溃。walkAnim
未被保留,它将在稍后发布,当您尝试使用它时,您的应用会崩溃。必须保留。self
方法中调用init
上的方法。根据定义,您的对象在init
方法中未处于完全初始化状态。如果您在self
上调用方法,则会发生奇怪的事情。其他init
方法也是例外。虽然我不能保证这没有错误,因为我不熟悉Cocoas2d,这可以让你更接近你想要的东西:
-(id)init
{
self = [CCSprite initWithSpriteFrameName:@"antNormal_1.png"];
if (self)
{
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"char.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"char.png"];
[self addChild:spriteSheet];
NSMutableArray *walkAnimFrames = [NSMutableArray array];
for (int i=1; i<=3; i++) {
[walkAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:@"antNormal_%d.png",i]]];
}
walkAnim = [[CCAnimation animationWithSpriteFrames:walkAnimFrames delay:0.1f] retain];
}
return self;
}
-(void)startWalkAction
{
CCAction* walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim]];
[self runAction:walkAction];
}
然后添加这样的敌人:
enemies=[[CCArray alloc] initWithCapacity:100];
for (int i=0; i<10; i++) {
Enemy* ant=[[Enemy alloc] init];
[ant setPosition:ccp(100*i,100)];
[ant startWalkAction];
[enemies addObject:ant];
}