0

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 をコメントアウトすると、アニメーションなしで敵が正しく表示されます (明らかに)。現時点ではこれを解決する方法がわかりません。

4

1 に答える 1

1

init具体的に Cocos2d と話すことはできませんが、問題の原因と思われる ObjC の観点から、あなたのメソッドにはいくつかの間違いがあります。

  1. self自分自身を 2 回設定します。2 つ目は、クラスの新しいインスタンスを作成し、古いインスタンスを上書きします。initクラスファクトリメソッドではなく、メソッドの結果にのみ self を設定する必要があります
  2. selfnil はチェックされません。ivar を設定する前にself、常にnilをチェックする必要があります。呼び出したメソッドが失敗した場合、if は nil になり、アプリはクラッシュします。init
  3. walkAnimは保持されず、後でリリースされ、使用しようとするとアプリがクラッシュします。保持する必要があります。
  4. selfカスタムメソッドでメソッドを呼び出さないでくださいinitinit定義上、オブジェクトはメソッド内で完全に初期化された状態ではありません。でメソッドを呼び出すと、奇妙なことが発生する可能性があります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];
}
于 2013-07-28T19:48:35.563 に答える