Мне интересно, может ли кто-нибудь объяснить мне, как повторно использовать анимацию в cocos2d?Я привык к так называемому обычному способу: я создаю «игровой объект», загружаю анимации и после этого просто вызываю мои анимации, такие как gameObj->idle();
или gameObj->walkToPoint();
...
Я понимаю, что эти вспомогательные методыдолжен быть определен мной, и я также изучил много руководств по CC2d и использованию анимации по-разному, но эти руководства слишком просты и не отражают реальные случаи.
Так что на данный момент я написал методкоторый загружает анимацию из текстур plist и png, добавляет эту текстуру в родительский слой и назначает первый спрайт для спрайта 'Game Object'.Но у меня есть несколько вопросов - я все еще не могу найти способ воспроизвести анимацию.
Ситуация для меня более сложная (но я знаю, что это обычный случай :) - анимации должны быть назначены «действиям»и там должны быть разные типы действий.Например: простое действие воспроизводится вечно, смерть воспроизводится один раз и остается в последнем кадре, а действие съемки воспроизводится один раз и восстанавливает предыдущий кадр - простой.
Чтобы упростить задачу, я покажу некоторый основной код безсложные проверки и for..in циклы (интересно, кто решил хранить все кадры в формате анимации cc2d как Array и загружать их с frame_%d
, а не как словарь со структурой 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;
}
Этот код работает правильно (загружает бездействующую анимацию и воспроизводит ее вечно), но я не могу найти способ переключаться между действиями и анимацией красиво.Я видел подходы, когда, например, когда кто-то не хочет снимать анимацию, он удаляет оригинальный спрайт, берет первый спрайт из фотосессии, играет стреляет, удаляет стреляющий спрайт, восстанавливает оригинальный спрайт.Но что, если спрайт был повернут?Нужно передать все параметры из оригинального спрайта, такие как переворот, вращение, масштабирование и т. Д. Назад и вперед между спрайтами?Обычно игровые объекты наследуются от 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...
Так может кто-нибудь объяснить мне, как создавать игровые объекты свспомогательные методы для переключения анимации?Пожалуйста, не посылайте меня в cc2d docs, потому что неясно, как решить эту простую проблему из cc2d docs или другого учебника в Интернете.