2012-07-19 130 views
1

的Cocos2D两个动画动画我我的性格像:一个精灵

-(void) createHero 
{ 


    _batchNode = [CCSpriteBatchNode batchNodeWithFile:@"Snipe1.png"]; 
    [self addChild:_batchNode]; 
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Snipe1.plist"]; 

    //gather list of frames 
    NSMutableArray *runAnimFrames = [NSMutableArray array]; 
    for(int i = 1; i <= 7; ++i) 
    { 
     [runAnimFrames addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
     [NSString stringWithFormat:@"run000%d.png", i]]]; 
    } 

    //create sprite and run the hero 
    self.hero = [CCSprite spriteWithSpriteFrameName:@"run0001.png"]; 
    _hero.anchorPoint = CGPointZero; 
    _hero.position = self.heroRunningPosition; 

    //create the animation object 
    CCAnimation *runAnim = [CCAnimation animationWithFrames:runAnimFrames delay:1/30.0f]; 
    self.runAction = [CCRepeatForever actionWithAction: [CCAnimate actionWithAnimation:runAnim restoreOriginalFrame:YES]]; 

    [_hero runAction:_runAction]; 
    [_batchNode addChild:_hero z:0]; 
} 

这工作得很好了我的性格正在运行,但现在我想第二个动画,当他跳跃。目前,我让这样的:

-(void)changeHeroImageDuringJump 
{ 
    [_hero setTextureRect:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"run0007.png"].rect]; 
} 

但现在我想用第二PNG第二的plist,所以我得到了一个全新的动画当角色跳跃。我怎样才能实现呢?

回答

3

在我的情况下,我实现了一个AnimatedSprite类来处理这个问题。这样一来,我想补充文件,像这样:

NSDictionary* anims = [NSDictionary dictionaryWithObjectsAndKeys: 
     @"Animations/Character/idle_anim.plist", @"Idle", 
     @"Animations/Character/walk_anim.plist", @"Walk", 
     @"Animations/Character/run_anim.plist", @"Run", nil]; 

CCNode* myNode = [[AnimatedSprite alloc] initWithDictionary:anims 
         spriteFrameName: @"character_idle_01.png" 
         startingIndex:@"Idle"]; 

更改动画很简单,只要:

[myNode setAnimation: @"Run"]; 

我的继承人履行这是.H

@interface AnimatedSprite : CCSprite 
{ 
    NSMutableDictionary* _spriteAnimations; 
    CCAction* _currentAnimation; 
    NSString* _currentAnimationName; 
    bool _initialized; 
} 
- (id) initWithTextureName:(NSString*) textureName; 
- (id) initWithArray: (NSArray*) animList spriteFrameName: (NSString*) startingSprite startingIndex: (int)startingIndex; 
- (id) initWithDictionary:(NSDictionary *)anims spriteFrameName:(NSString *)startingSprite startingIndex:(NSString *)startingAnim; 

- (void) addAnimation: (NSString*) animationName andFilename: (NSString*) plistAnim; 

- (void) setAnimationIndex: (int) index; 
- (void) setAnimation: (NSString*) animationName; 
@end 

这是.m

#import "AKHelpers.h" 

@implementation AnimatedSprite 

NSMutableDictionary* _spriteAnimations; 

- (id) initWithTextureName:(NSString*) textureName 
{ 
    CCTexture2D* texture = [[CCTextureCache sharedTextureCache] addImage:textureName]; 
    CCSpriteFrame* frame = [CCSpriteFrame frameWithTexture:texture rect: CGRectMake(0, 0, 1, 1)]; 

    if ((self=[super initWithSpriteFrame:frame])) 
    { 
     _currentAnimationName = nil; 
     _currentAnimation = nil; 
     _spriteAnimations = [[NSMutableDictionary alloc] init ]; 
     _initialized = true; 

    } 
    return self; 
} 
- (id) initWithArray: (NSArray*) animList spriteFrameName: (NSString*) startingSprite startingIndex: (int)startingIndex 
{ 
    _initialized = false; 
    _spriteAnimations = [[NSMutableDictionary alloc] init]; 

    // Add animations as numbers from 0 to animList.count 
    int i = 0; 
    for (NSString* anim in animList) 
    { 
     [self addAnimation: [NSString stringWithFormat:@"%d", i] andFilename:anim]; 
     i++; 
    } 

    if ((self = [super initWithSpriteFrameName:startingSprite])) 
    { 
     _currentAnimationName = nil; 
     _currentAnimation = nil; 
     [self setAnimationIndex: startingIndex]; 
     _initialized = true; 
    } 

    return self; 
} 

- (id) initWithDictionary:(NSDictionary *)anims spriteFrameName:(NSString *)startingSprite startingIndex:(NSString *)startingAnim 
{ 
    _initialized = false; 
    _spriteAnimations = [[NSMutableDictionary alloc] init];//[[NSMutableArray alloc] init]; 

    // Add animations 
    for (NSString* key in anims) 
    { 
     [self addAnimation: key andFilename: [anims objectForKey: key] ]; 
    } 

    if ((self = [super initWithSpriteFrameName:startingSprite])) 
    { 
     _currentAnimationName = nil; 
     _currentAnimation = nil; 
     [self setAnimation: startingAnim]; 
     _initialized = true; 

    } 
    return self; 
} 
- (void) dealloc 
{ 
    [_currentAnimationName release]; 
    [_spriteAnimations release]; 
    [super dealloc]; 
} 

- (void) setAnimation: (NSString*) animationName 
{ 
    if (![_currentAnimationName isEqualToString:animationName]) 
    { 
     [_currentAnimationName release]; 
     _currentAnimationName = [animationName copy]; 

     // Stop current animation 
     if (_currentAnimation != nil) 
      [self stopAction:_currentAnimation]; 
     //[self stopAllActions]; 

     // Apply animation 
     NSDictionary* clip = [_spriteAnimations objectForKey: animationName]; 
     if (clip) 
     { 
      _currentAnimation = [AKHelpers actionForAnimationClip:clip]; 
      if (_currentAnimation) 
       [self runAction:_currentAnimation]; 
     } 
     else 
     { 
      _currentAnimation = nil; 
     } 
    } 
} 

- (void) setAnimationIndex: (int) index 
{ 
    [self setAnimation: [NSString stringWithFormat:@"%d", index]]; 
} 

- (void) addAnimation: (NSString*) animationName andFilename: (NSString*) plistAnim 
{ 
    NSDictionary *clip = [AKHelpers animationClipFromPlist:plistAnim]; 

    if (clip) 
    { 
     [_spriteAnimations setObject:clip forKey:animationName];   

     if (_initialized && [_spriteAnimations count] == 1) 
     { 
      [self setAnimation:animationName]; 
     } 
    } 
} 

@end 
+0

我在你的项目中添加了你的两个类,但是我不知道你如何实现他们我有Snipe1.plist Snipe2.plist和Snipe1.png和Snipe2.png。在plist中有run0001-run0007.png,在Snipe2中是jump0001-jump0007.png。我现在如何添加这两个动画?感谢您的回答 ! – dehlen 2012-07-19 16:29:41

+0

哦,什么是AKHelpers?我在哪里可以得到这个? – dehlen 2012-07-19 16:40:17

+0

你可以在这里找到AKHelpers,http://www.cocos2d-iphone.org/forum/topic/13851,它有它自己的动画plist格式。你所做的基本上是一个将引用纹理和坐标的plist,然后定义帧和持续时间。你可以让你的plist类似于这里找到的示例:https://github.com/anton-nikan/iOS-Animation-Kit/blob/master/Samples/cocos2d/frog-menu-anim.plist – 2012-07-19 16:59:25

1

为跑步和跳跃创建两个不同的动画动作。根据需要运行这些操作。