2011-08-08 99 views
0

我在想如果有人能解釋我如何在cocos2d中重新使用動畫?我習慣於所謂的通常的方式:我創建一個'遊戲對象',加載動畫,然後簡單地調用我的動畫,如gameObj->idle();gameObj->walkToPoint(); ...cocos2d中的動畫

我知道這些幫助器方法應該由我自己定義,我也學習了很多有關CC2d的指南,並以不同的方式使用動畫,但這些指南太簡單了,不會拍攝真實案例。

因此,在我寫這從plist中和PNG紋理加載動畫方法的那一刻,會將此紋理父層和第一精靈分配給「遊戲對象」精靈。但我有一些問題 - 我仍然無法找到播放動畫的方式。

情況對我來說比較困難(但我知道,這是通常的情況:) - 動畫應該被分配到「操作」,並應該有不同類型的動作。例如 - 空閒動作永遠播放,死亡播放一次,並停留在最後一幀,並且拍攝動作播放一次,並恢復先前的幀 - 閒置的一個。

爲了簡單起見,我將展示一些基本的代碼w \ o複雜的檢查和for..in循環(我想知道誰決定將所有幀以cc2d動畫格式存儲爲Array,並將它們加載爲frame_%d,而不是將Dictionary結構Animations->Idle->FramesAnimations->Shoot->Frames,但這不是主要的一點:))

//These things are global 
CCAnimation *idleAnim; 
CCAction * idleAction; // idle animation should be played forever 

CCAnimation *deathAnim; 
CCAction * deathAction; // death animation should be played once and stop at last frame 

CCAnimation *shootAnim; 
CCAction * shootAction; // shoot animation should be played once and idle frame restored 


    // loading animations with simple for loops 
    - (id)init { 
    self = [super initWithColor:ccc4(255,255,255,255)]; 
if (self) {  

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: 
    @"player.plist"]; 
    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode 
             batchNodeWithFile:@"player.png"]; 

    [self addChild:spriteSheet]; 

    NSMutableArray *idleAnimFrames = [NSMutableArray array]; 
    for(int i = 1; i <= 20; ++i) { 
     [idleAnimFrames addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
     [NSString stringWithFormat:@"hero_idle01_%04i_Layer-%i.png", i-1, i]]]; 
    } 

    idleAnim = [CCAnimation animationWithFrames:idleAnimFrames delay:0.1f]; 

    idleAction = [CCRepeatForever actionWithAction: 
        [CCAnimate actionWithAnimation:idleAnim restoreOriginalFrame:NO]]; 



    NSMutableArray *deathAnimFrames = [NSMutableArray array]; 
    for(int i = 0; i <= 30; ++i) { 
     [deathAnimFrames addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
     [NSString stringWithFormat:@"hero_death01_%04i_Layer-%i.png", i, i+1]]]; 
    } 

    deathAnim = [CCAnimation animationWithFrames:deathAnimFrames delay:0.1f]; 

    deathAction = [CCAnimate actionWithAnimation:deathAnim restoreOriginalFrame:NO]; 





    NSMutableArray *shootAnimFrames = [NSMutableArray array]; 
    for(int i = 0; i <= 19; ++i) { 
     [shootAnimFrames addObject: 
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
     [NSString stringWithFormat:@"hero_idleshoot02_%04i_Layer-%i.png", i, i+1]]]; 
    } 

    shootAnim = [CCAnimation animationWithFrames:shootAnimFrames delay:0.1f]; 

    shootAction = [CCAnimate actionWithAnimation:shootAnim restoreOriginalFrame:YES]; 



    self.player = [CCSprite spriteWithSpriteFrameName:@"hero_idle01_0000_Layer-1.png"];   

    self.player.position = ccp(20, self.size.height/2); 

    [self.player runAction:shootAction]; 

    [spriteSheet addChild:self.player]; 

    [self.player runAction:[CCRotateTo actionWithDuration:0.0f angle:45]]; 



    [self schedule:@selector(gameLogic:) interval:1.0]; 
    } 
    return self; 
} 

該代碼可以正常運行(負載空閒的動畫,永遠播放它),但我無法找到的行動,並很好地animatinos之間切換的方式。例如,當有人不想拍攝動畫時,我看到了一些方法,他刪除了原始精靈從拍攝中獲取第一個精靈,玩過拍攝,刪除了拍攝精靈,恢復了原始精靈。但是,如果精靈被旋轉了呢?人們應該通過精靈之間的原始精靈的所有參數,例如翻轉,旋轉,縮放等等。通常遊戲對象是從CCSprite繼承而來的,所以這種方法通常意味着應該一直刪除和恢復主遊戲對象?這對我來說並不明確。

我嘗試了接下來的事情,但他們沒有爲我工作,程序只是暫停,沒有任何東西寫入調試(我是來賓,這是因爲錯誤發生在其他線程中,負責觸摸處理的線程)。

// somewhere after touch happened in [shootToPoint:(CGPoing)point] method 
    [idleAction stop]; 
    [shootAction startWithTarget:self.player]; 
    [self.player runAction:[CCSequence actions: 
          shootAction, 
          [CCCallFuncN actionWithTarget:self selector:@selector(shooted)], 
          nil]]; 

而在shooted方法我再次呼籲這樣的事:

[shootActino stop]; // or [self.player stopAllActions] - doesn't matter I guess 
    [idleAction startWithTarget:self.player]; 
    CCSprite *sprite = (Bullet *)sender; // remove bullet sprite from memory 
    [self removeChild:sprite cleanup:YES]; // remove bullet sprite from memory 
    // other routines... 

所以有人可以解釋我如何創建的helper方法的遊戲對象切換動畫?請不要將我發送到cc2d文檔,因爲目前還不清楚如何從網絡上的cc2d文檔或其他教程解決這個簡單問題。

回答

2

因爲要創建具有輔助方法,而不是你的情況下,分配/ initWith ......之後就被自動釋放,這就是爲什麼你得到一個崩潰。

例如你的空閒動畫應該像這樣創建:

NSMutableArray *idleAnimFrames = [[NSMutableArray alloc] init]; 
for(int i = 1; i <= 20; ++i) { 
    [idleAnimFrames addObject: 
    [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
     [NSString stringWithFormat:@"hero_idle01_%04i_Layer-%i.png", i-1, i]]]; 
} 

CCAnimation *idleAnimation = [[CCAnimation alloc] initWithFrames:idleAnimFrames delay:0.1f]; 
[idleAnimFrames release]; 

CCAnimate *idleAnimate = [[CCAnimate alloc] initWithAnimation:idleAnimation restoreOriginalFrame:NO]; 
[idleAnimation release]; 

idleAction = [[CCRepeatForever alloc] initWithAction:idleAnimate]; 
[idleAnimate release]; 

這樣,直到你釋放它(你應該在你的dealloc方法做,否則當你的地方,你可以使用這個動作多次'完成了它)。

+0

哦,我一直在使用objective-c一段時間,但仍然陷入這些保留/釋放陷阱......我知道正確的答案是在角落附近:)非常感謝你! – asdf