Изменить анимацию Cocos2d - PullRequest
       6

Изменить анимацию Cocos2d

1 голос
/ 17 февраля 2012

У меня есть вопрос об анимации; У меня есть класс с анимацией;

@interface Player : CCNode{

    CCSprite *_player;
    CCSpriteBatchNode *spriteSheet;
    CCAction *walkAction;
    CCAnimation *walkAnim;


    int playerSpeed;
    int xPos;
    int yPos;
    int state;
    int currentAnim;
}
@property (nonatomic, retain) CCSprite *_player;



-(id)init {

    if( (self=[super init] )) {

        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"duckAnimDown.plist"];
        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"DuckAnimTurn.plist"];
        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"duckAnimUp.plist"];



        currentAnim = 0;
        state = 0;
        [self chekState];
    }
    return self;
}
-(void)setState:(int)st {

    state = st;
    [self chekState];
}
-(void)chekState{


    [self stopAllActions];
    walkAnim = nil;


    if (state == 1 && currentAnim != state) {
        [spriteSheet removeChild:_player cleanup:YES];
        spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"duckAnimDown.png"];
        NSMutableArray *walkAnimFrames = [NSMutableArray array];
        for (int i = 1; i <= 12 ; ++i) {
            [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"duck_down%d.png", i]]];
        }
        walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.04f];//0.06
        _player = [CCSprite spriteWithSpriteFrameName:@"duck_down1.png"];
        walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];

    }
    if (state == 2 && currentAnim != state) {
        [spriteSheet removeChild:_player cleanup:YES];
        spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"DuckAnimTurn.png"];
        NSMutableArray *walkAnimFrames = [NSMutableArray array];
        for (int i = 1; i <= 10 ; ++i) {
            [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"duck_turn%d.png", i]]];
        }
        walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.04f];//0.06
        _player = [CCSprite spriteWithSpriteFrameName:@"duck_turn1.png"];
        walkAction = [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO];

    }
    if (state == 3 && currentAnim != state) {

        [spriteSheet removeChild:_player cleanup:YES];
        spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"duckAnimUp.png"];
        NSMutableArray *walkAnimFrames = [NSMutableArray array];

        for (int i = 1; i <= 13 ; ++i) {
            [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"duck_up%d.png", i]]];
        }
        walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.04f];//0.06
        _player = [CCSprite spriteWithSpriteFrameName:@"duck_up1.png"];
        walkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];

    }
    if (currentAnim != state) {
        [_player runAction:walkAction];
        [spriteSheet addChild:_player];
        [self addChild:spriteSheet];
        currentAnim = state;
    }



}

Я использую этот класс в GameplayScene;

duckSprite = [Player node];

Чтобы изменить анимацию, я звоню: [duckSprite setState:2];

Это нормально, но когда я меняю анимацию, FPS очень низкие 20 - 25; Что не так в моем коде? Благодаря.

1 Ответ

1 голос
/ 17 февраля 2012

Возможно, проблема в том, что вы делаете слишком много вещей в вашем методе checkState. Вы можете переместить почти все это в метод init, а затем просто вызвать runAction для соответствующей анимации.

Также вам, вероятно, следует использовать только один лист спрайтов для всех анимаций. Таким образом, вам не нужно будет перезагружать спрайт игрока каждый раз, когда меняется анимация.

Вот учебник , в котором все хорошо объясняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...