#ios #objective-c #animation #sprite-kit
#iOS #objective-c #Анимация #sprite-kit
Вопрос:
я не совсем понимаю, какой лучший выбор в анимации sprite kit; 1) Apple в примере «Adventure» использует эту методологию, они сохраняют анимацию в памяти в виде изображений в nsarray :
static NSArray *sSharedTouchAnimationFrames = nil;
- (NSArray *)touchAnimationFrames {
return sSharedTouchAnimationFrames;
}
- (void)runAnimation
{
if (self.isAnimated) {
[self resolveRequestedAnimation];
}
}
- (void)resolveRequestedAnimation
{
/* Determine the animation we want to play. */
NSString *animationKey = nil;
NSArray *animationFrames = nil;
VZAnimationState animationState = self.requestedAnimation;
switch (animationState) {
default:
case VZAnimationStateTouch:
animationKey = @"anim_touch";
animationFrames = [self touchAnimationFrames];
break;
case VZAnimationStateUntouch:
animationKey = @"anim_untouch";
animationFrames = [self untouchAnimationFrames];
break;
}
if (animationKey) {
[self fireAnimationForState:animationState usingTextures:animationFrames withKey:animationKey];
}
self.requestedAnimation = VZAnimationStateIdle;
}
- (void)fireAnimationForState:(VZAnimationState)animationState usingTextures:(NSArray *)frames withKey:(NSString *)key
{
SKAction *animAction = [self actionForKey:key];
if (animAction || [frames count] < 1) {
return; /* we already have a running animation or there aren't any frames to animate */
}
[self runAction:[SKAction sequence:@[
[SKAction animateWithTextures:frames timePerFrame:self.animationSpeed resize:YES restore:NO],
/* [SKAction runBlock:^{
[self animationHasCompleted:animationState];
}]*/]] withKey:key];
}
Я ценю эту методологию, но я не могу понять. Не лучше ли хранить SKAction в памяти и использовать анимацию всегда так?
[self runAction:action];
без создания всегда нового SKAction;
[SKAction animateWithTextures:frames timePerFrame:self.animationSpeed resize:YES restore:NO]
Комментарии:
1. Документация Apple по SpriteKit такова… не хватает вежливости. Я нашел много случаев, когда мой код значительно короче и слаще, чем в примерах. Я вообще доверяю Ray. raywenderlich.com/45152 /…
2. В руководстве Рэя также эта методика, когда анимационные изображения хранятся в NSArray
3. Также можно протестировать его на производительность и ответить на ваш собственный вопрос. Сообщество определенно может извлечь выгоду.
Ответ №1:
Хранение SKTextures
в an NSArray
— рекомендуемая методология для анимации. Я не могу сказать, что я обнаружил, что документация SpriteKit также отсутствует по этому вопросу, поскольку у SKAction есть метод animateWithTextures
.
У вас действительно может быть a SKAction
, в котором заданная анимация определяется заданным NSArray
, и, возможно, хранить их в a NSMutableDictionary
с именем анимации для ключа. Однако эта методология, которую я вижу выше, содержит строку кода animateTextures только один раз в своем fireAnimationState
методе, и вы можете передать ей параметры, такие как animationState
и key
.
Я думаю, вам нужно было бы более поверхностно взглянуть на их методологию, чтобы определить, почему они решили пойти по этому пути. Вы можете видеть, что animationState
он использовался после завершения анимации и, вероятно, вызвал что-то еще.
[self runAction:action]
действительно просто, однако также легко видеть, что он никоим образом не управляет animationState или key, что, я должен предположить, они решили, что их игра должна была сделать.
Также имейте в виду, что их методология, вероятно, имеет более высокий уровень, когда в данном классе player вызывается гибкий метод для создания анимации для данного игрового объекта и выполнения других действий, помимо простого изменения анимации. Таким образом, в их высокоуровневом кодировании они могут делать что-то подобное :
[self runAnimation:@"jump"];
или даже
[self jump];
И поскольку они разработали низкоуровневую систему, которая управляет состояниями анимации и добавляет ключи для заданного дизайна управления, им никогда не нужно кодировать длинную строку, на которую вы указываете, за исключением одного раза в том методе, который вы видите выше.
Несколько причин, по которым я счел полезным хранить NSArray
кадры of, а не хранить их в формате a SKAction
, заключаются в том, что иногда я хочу манипулировать начальным кадром анимации или запускать анимацию с другой скоростью. Но у вас может быть или не быть необходимости манипулировать этими аспектами вашей анимации.
Комментарии:
1. Спасибо за описание!