0

現在 Kobold2d (cocos2d) でモバイル ゲームを開発していますが、1 つの CCSprite を複数のアニメーションでアニメーション化するのに苦労しています。私の質問は: 同じ CCSprite (プレーヤー) を使用して、2 つの異なるアニメーションでアニメーション化する方法です。Kobold2D 2.0.4 と Xcode 4.6 を使用しています。アニメーション用に、pvr.ccz で圧縮された textureAtlas を使用しています。

アニメーション ヘルパー クラスを作成します。

+(CCAnimation *) startFrames:(int) startFrame
                 endFrame:(int) endFrame
                frameName:(NSString *) frameName
                    delay:(float) delay
{
    NSMutableArray *frames = [NSMutableArray arrayWithCapacity:endFrame];
    CCSpriteFrameCache *sharedFrameCache = [CCSpriteFrameCache sharedSpriteFrameCache];

    for (int i = startFrame; i <= endFrame; i++) {
        CCSpriteFrame *frame = [sharedFrameCache spriteFrameByName:[NSString stringWithFormat:@"%@%i.png",frameName,i]];
        [frames addObject:frame];
    }

    return [CCAnimation animationWithSpriteFrames:frames delay:delay];
}

+(CCAnimation *) jumpPoints:(CGPoint[]) points
                startFrames:(int) startFrame
                   endFrame:(int) endFrame
                  frameName:(NSString *) frameName
                      delay:(float) delay
{
    NSMutableArray *frames = [NSMutableArray arrayWithCapacity:endFrame];
    CCSpriteFrameCache *sharedFrameCache = [CCSpriteFrameCache sharedSpriteFrameCache];

    for (int i = startFrame; i <= endFrame; i++) {
        CCSpriteFrame *frame = [sharedFrameCache spriteFrameByName:[NSString stringWithFormat:@"%@%i.png",frameName,i]];
        [frame setOffsetInPixels:points[i]];
        [frames addObject:frame];
    }

    return [CCAnimation animationWithSpriteFrames:frames delay:delay];
}

プレーヤーを初期化し、2 つの CCAnimation を作成するプレーヤー クラスを取得しました。ヘッダー ファイルには、次の 2 つの CCAnimate 型変数を格納します。

CCAnimate *jump;
CCAnimate *walk;

.m ファイル内

-(id) init
{
    if (self = [super init])
    {        
        sprite = [[Loading shareLoading] loadTempCcsprite];
        CGSize screenSize = [[CCDirector sharedDirector] winSize];

        localPostion = CGPointMake(screenSize.width, screenSize.height);

        CGPoint points[] = {CGPointMake(0, 10),CGPointMake(0, 50),CGPointMake(0, 80),
            CGPointMake(0, 10),CGPointMake(0, 0)};
        CCAnimation *animationJump = [CCAnimationHelper jumpPoints:points startFrames:0 endFrame:4 frameName:@"cactus" delay:0.10f];

        jump = [CCAnimate actionWithAnimation:animationJump];

        CCAnimation *animationWalk = [CCAnimationHelper startFrames:0 endFrame:4 frameName:@"cactus" delay:0.10f];

        walk = [CCAnimate actionWithAnimation:animationWalk];

        [self addChild:sprite];
    }
    return self;
}

最後に、ユーザーがプレイヤーを動かすための 2 つのジャンプ ボタンと攻撃とジョイスティックを取得する入力レイヤーがあります。

コードは次のとおりです。

-(void) update:(ccTime)delta
{
    if ([jump active])
    {
        CCAnimate *animation = [player jump];
        [player runAction:animation];
    }
    else if (joystick.velocity.x > 0)
    {
        float velocity = [joystick velocity].x * 700 * delta;

        CGPoint playerPosition = CGPointMake([player localPostion].x + velocity * delta, [player localPostion].y    );

        id animation = [player walk];
        [player runAction:animation];
        [player setLocalPostion:playerPosition];
    }
}

このコードをコンパイルすると、入力レイヤーでジャンプ ボタンを押したときにゲームがクラッシュし、出力コンソールに次のように表示されます。

* -[CCActionManager addAction:target:paused:] でのアサーションの失敗

4

1 に答える 1

1

実行中に同じアクションを再度実行しようとしています。

この状況を回避するには、runAction の前に必ず stopAction を呼び出します。

[player stopAction:animation];
[player runAction:animation];
于 2013-04-03T13:14:50.527 に答える