Cocos2d中的动画必须是非零的

时间:2013-07-28 18:38:41

标签: objective-c cocos2d-iphone

我正在尝试创建一个名为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,敌人会正确显示,只是没有动画(显然)。目前还不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

虽然我不能专门与Cocos2d交谈,但是从ObjC的角度来看,你的init方法中存在一些可能导致问题的错误。

  1. self自设两次。第二个创建了类的新实例,并破坏了旧实例。您应该只将self设置为init方法的结果,而不是类工厂方法
  2. self未检查为零。在设置任何ivars之前,您应该始终检查self是否为 。如果您调用的init方法失败,if将为nil,您的应用将崩溃。
  3. walkAnim未被保留,它将在稍后发布,当您尝试使用它时,您的应用会崩溃。必须保留。
  4. 请勿在自定义self方法中调用init上的方法。根据定义,您的对象在init方法中未处于完全初始化状态。如果您在self上调用方法,则会发生奇怪的事情。其他init方法也是例外。
  5. 虽然我不能保证这没有错误,因为我不熟悉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];
    }