2012-04-19 125 views
0

我開始玩Cocos2D,我想通過精靈表做一個精靈動畫。Cocos2D角色動畫

現在我有一個小機器人在我的屏幕上四處走動。但我想知道如何將一個動畫放到另一個動畫中。

例如,我的機器人有一個步行動畫,我想單獨移動他的手臂。但是他的肩膀在走路時會起伏,手臂應該相對於他的肩膀位置移動。

我的步行動畫有五個精靈,我有九個不同的手臂位置。現在,我可以將武器添加到所有九個手臂位置的每一個步行精靈。但後來我會有45個圖像,而不是14.

+0

你機器人需要成爲spritesheet – 2012-04-19 18:27:59

回答

0

這是一個很好的問題(最後!)。

我會做的是將你的角色分成不同的精靈(你已經這樣做了),這些精靈可以自己動畫化。

然後,無論何時顯示該動畫的一幀,我都會執行一段代碼來修改臂動畫的位置,以便與肩膀相匹配。

要執行該代碼塊,您需要Cocos 1.1或更高版本,因爲他們在那裏添加了CCAnimationFrame,但是,這些框架只能通過NSNotification執行代碼,所以我做了一個改進,因此我們可以設置一個塊在一個框架上,並且該框架將在該框架被顯示時執行。

只要找到CCAnimation.h和修改CCAnimationFrame界面看起來像這樣:

typedef void(^FrameBlock)(CCSprite *sprite); 

/** CCAnimationFrame 
A frame of the animation. It contains information like: 
- sprite frame name 
- # of delay units. 
- offset 

@since v1.1 
*/ 
@interface CCAnimationFrame : NSObject <NSCopying> 
{ 
    CCSpriteFrame* spriteFrame_; 
    float delayUnits_; 
    NSDictionary *userInfo_; 

    FrameBlock frameBlock; 
} 
/** CCSpriteFrameName to be used */ 
@property (nonatomic, readwrite, retain) CCSpriteFrame* spriteFrame; 

/** how many units of time the frame takes */ 
@property (nonatomic, readwrite) float delayUnits; 

/** A CCAnimationFrameDisplayedNotification notification will be broadcasted when the frame is displayed with this dictionary as UserInfo. If UserInfo is nil, then no notification will be broadcasted. */ 
@property (nonatomic, readwrite, retain) NSDictionary *userInfo; 

/** If the block is not NULL, it will be executed when the frame becomes visible **/ 
@property (nonatomic, readwrite, copy) FrameBlock frameBlock; 

/** initializes the animation frame with a spriteframe, number of delay units and a notification user info */ 
-(id) initWithSpriteFrame:(CCSpriteFrame*)spriteFrame delayUnits:(float)delayUnits userInfo:(NSDictionary*)userInfo; 
-(id) initWithSpriteFrame:(CCSpriteFrame*)spriteFrame delayUnits:(float)delayUnits block:(FrameBlock)block; 
@end 

,然後打開CCAnimation.m並確保CCAnimationFrame實施看起來是這樣的:

@implementation CCAnimationFrame 

@synthesize spriteFrame = spriteFrame_, delayUnits = delayUnits_, userInfo=userInfo_; 

@synthesize frameBlock; 

-(id) initWithSpriteFrame:(CCSpriteFrame *)spriteFrame delayUnits:(float)delayUnits userInfo:(NSDictionary*)userInfo 
{ 
    if((self=[super init])) { 
     self.spriteFrame = spriteFrame; 
     self.delayUnits = delayUnits; 
     self.userInfo = userInfo; 
    } 

    return self; 
} 

-(id) initWithSpriteFrame:(CCSpriteFrame*)spriteFrame delayUnits:(float)delayUnits block:(FrameBlock)block{ 
    self = [self initWithSpriteFrame:spriteFrame delayUnits:delayUnits userInfo:nil]; 
    if(self){ 
     [self setFrameBlock:block]; 
    } 
    return self; 
} 

-(void) dealloc 
{  
    CCLOGINFO(@"cocos2d: deallocing %@", self); 

    [spriteFrame_ release]; 
    [userInfo_ release]; 

    [super dealloc]; 
} 

-(id) copyWithZone: (NSZone*) zone 
{ 
    CCAnimationFrame *copy = [[[self class] allocWithZone: zone] initWithSpriteFrame:[[spriteFrame_ copy] autorelease] delayUnits:delayUnits_ userInfo:[[userInfo_ copy] autorelease] ]; 
    return copy; 
} 

-(NSString*) description 
{ 
    return [NSString stringWithFormat:@"<%@ = %08X | SpriteFrame = %08X, delayUnits = %0.2f >", [self class], self, spriteFrame_, delayUnits_ ]; 
} 
@end 

然後,當創建動畫幀時,添加一個塊,在其中設置手臂的位置以匹配肩膀。

我希望它有幫助。