1

私は主に、自分の Player クラスの使用方法とそれを改善する方法についての批判の後であると思います。

私のスプライトシートには、求めているアクションに必要と思われるすべてのシーケンスが含まれています。しかし、私が最初に望むのは、「ジャンプ」ボタンが押されたときに、キャラクターが通過しているアニメーションが停止し、それが使用したスプライトシートからの「ジャンプ」シーケンスです。(ウォーク - たとえば、フレーム 7 から 9 で、ジャンプはフレーム 10 から 13 です)。

プレイヤースプライトを作成する方法は次のとおりです。

Player.m :

-(id)playerCharacter {
     if (self = [super init]) {

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Soldier.plist"];

    // Create a sprite sheet with the Player images
    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"Soldier.png"];
    [self addChild:spriteSheet z:15];

    NSMutableArray *walking = [NSMutableArray array];
    for(int i = 7; i <= 9; ++i) {
        [walking addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Soldier%d.png", i]]];
    }

    CCAnimation *walkingAnimation = [CCAnimation animationWithSpriteFrames:walking delay:0.2f];

    _walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkingAnimation]];

    walkAnim.restoreOriginalFrame = NO;

    [self runAction:_walkAction];

    self.velocity = ccp(0.0, 0.0);  
}
return self;
}

GameLevelLayer.m

      player = [[Player alloc] playerCharacter];
      player.position = ccp(100,50);
      [map addChild:player z:15];

私の質問は..そのメソッドのCCAnimationコンポーネント全体をそこから移動して、スプライトシート/アニメーションシーケンスを定義する一連のBOOLをチェックする新しいメソッドに移動する必要がありますか?

上記のコードを最も効率的な方法で使用していますか? そのままで機能することは感謝していますが、プロジェクトに非効率性を追加する道を進むよりも、正しく行っているかどうかを理解したいと思います。

フィードバックやご支援をいただければ幸いです。

4

1 に答える 1

1

CCSpriteBatchNode を適切に使用していません。これは、1 つのスプライト シートからすべてのスプライトを保持するレイヤーと考えてください。プレーヤーをバッチノードに追加し、バッチノードをゲームレイヤーに追加する必要があります。したがって、プレーヤーは次のように作成する必要があります。

-(id)playerCharacterOnSheet:(CCSpriteBatchNode*)batchNode
{
     // this is assuming Player is a CCSprite subclass
     // set this to the "static"/default player sprite image
     if (self = [super initWithSpriteFrameName:@"Soldier1.png"])
     {
        // Load self to the batchnode
        [batchNode addChild:self];

        NSMutableArray *walking = [NSMutableArray array];
        for(int i = 7; i <= 9; ++i) {
            [walking addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Soldier%d.png", i]]];

        CCAnimation *walkingAnimation = [CCAnimation animationWithSpriteFrames:walking delay:0.2f];

        _walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkingAnimation]];

        walkAnim.restoreOriginalFrame = NO;

        [self runAction:_walkAction];

        self.velocity = ccp(0.0, 0.0);  
    }
    return self;
}

次に、GameLevelLayer で、batchNode とプレーヤーを作成します。

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Soldier.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"Soldier.png"];
[map addChild:spriteSheet];

player = [[Player alloc] playerCharacterOnSheet:spriteSheet];
player.position = ccp(100,50);

他のアクションを実行するには、Player クラスにメソッドを追加してそれらを実行します (実行中の他のアクションを停止します)。例えば:

-(void)jumpAction
{
    [self stopAllActions];

    NSMutableArray *jumping = [NSMutableArray array];
    for(int i = 10; i <= 13; ++i) {
        [jumping addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"Soldier%d.png", i]]];
        }

    CCAnimation *jumpingAnimation = [CCAnimation animationWithSpriteFrames:jumping delay:0.2f];

    CCAction *jumpAction = [CCAnimate actionWithAnimation:jumpingAnimation ];
    [self runAction:jumpAction];

}

実行するには、次のように呼び出します。

[player jumpAction];
于 2013-05-22T18:45:08.660 に答える