1

我想我主要是在对我使用 Player 类的方式以及如何改进它进行批评之后。

我的 spritesheet 包含我认为我需要的所有序列来执行我所追求的动作。但我最初想要的是,当我的“跳跃”按钮被按下时,角色正在经历的动画被停止,并且它使用的 spritesheet 中的“跳跃”序列。(步行 - 例如是第 7 帧到第 9 帧,跳跃是第 10 帧到第 13 帧)。

以下是我制作玩家精灵的方式:

播放器.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 组件移出那里,进入一个新方法,该方法正在检查一系列定义 spritesheet / 动画序列的 BOOL?

我什至以最有效的方式使用上述代码吗?虽然我很欣赏它按原样工作.. 我宁愿了解我是否正确地做事,也不愿继续走一条增加我的项目效率低下的道路。

我非常感谢任何反馈和帮助。

4

1 回答 1

1

您没有正确使用 CCSpriteBatchNode。把它想象成一个层,它将保存来自单个精灵表的所有精灵。你的玩家应该被添加到batchnode,你的batchnode被添加到你的游戏层。因此,您的 Player 应按如下方式创建:

-(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 和 player:

[[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 回答