2012-02-17 77 views
1

我对动画有一些疑问; 我有动画课,更改动画Cocos2d

@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

可能问题在于你在checkState方法中做了太多事情。 您几乎可以将它全部移动到init方法,然后调用runAction来获取适当的动画。

另外,您应该只为所有动画使用一个精灵表。这样,每次动画更改时都不需要重新加载播放器精灵。

这是一个tutorial,它很好地解释了一切。