我在想如果有人能解釋我如何在cocos2d中重新使用動畫?我習慣於所謂的通常的方式:我創建一個'遊戲對象',加載動畫,然後簡單地調用我的動畫,如gameObj->idle();
或gameObj->walkToPoint();
...cocos2d中的動畫
我知道這些幫助器方法應該由我自己定義,我也學習了很多有關CC2d的指南,並以不同的方式使用動畫,但這些指南太簡單了,不會拍攝真實案例。
因此,在我寫這從plist中和PNG紋理加載動畫方法的那一刻,會將此紋理父層和第一精靈分配給「遊戲對象」精靈。但我有一些問題 - 我仍然無法找到播放動畫的方式。
情況對我來說比較困難(但我知道,這是通常的情況:) - 動畫應該被分配到「操作」,並應該有不同類型的動作。例如 - 空閒動作永遠播放,死亡播放一次,並停留在最後一幀,並且拍攝動作播放一次,並恢復先前的幀 - 閒置的一個。
爲了簡單起見,我將展示一些基本的代碼w \ o複雜的檢查和for..in循環(我想知道誰決定將所有幀以cc2d動畫格式存儲爲Array,並將它們加載爲frame_%d
,而不是將Dictionary結構Animations->Idle->Frames
Animations->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文檔或其他教程解決這個簡單問題。
哦,我一直在使用objective-c一段時間,但仍然陷入這些保留/釋放陷阱......我知道正確的答案是在角落附近:)非常感謝你! – asdf