使用图片或SKAction存储在内存NSArray中

时间:2014-06-26 19:58:44

标签: ios objective-c animation sprite-kit

我不完全理解精灵套件动画的最佳选择; 1)Apple在“冒险”示例中使用此方法,它们将内存动画存储为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 个答案:

答案 0 :(得分:1)

SKTextures存储在NSArray中是推荐用于动画的方法。我不能说我发现SpriteKit的文档也缺乏这个主题,因为SKAction的方法是animateWithTextures

您确实可以拥有一个由给定SKAction定义的给定动画的NSArray,并且可以将这些动画存储在具有动画名称的NSMutableDictionary中。但是,我在上面看到的这种方法只是在fireAnimationState方法中使用了animateTextures代码行,您可以将参数传递给它,例如animationStatekey

我认为你需要采取更多的表面看他们的方法来确定他们选择走这条路的原因。您可以看到动画完成后animationState被使用,可能会触发其他内容。

[self runAction:action]确实很简单,但是很容易看出它不会以任何方式管理animationState或key,我必须假设他们决定自己的游戏需要做。

另外请记住,他们的方法可能具有更高的水平,在给定的玩家类中,它调用一种灵活的方法来为给定的游戏实体制作动画,并且除了更改动画之外还要做其他事情。因此,在他们的高级编码中,他们可能会做更多这样的事情:

[self runAnimation:@"jump"];

甚至

[self jump];

因为他们设计了一个管理动画状态的低级系统并为给定的管理设计添加了关键字,所以他们不需要编写你指出的长行代码,除非你在上面看到的方法中有一次。

我发现存储NSArray帧并且不存储包裹在SKAction中有用的一些原因是因为我有时想要操纵动画的开始帧或者在以下位置运行动画不同的速度。但是你可能需要也可能不需要操纵动画的这些方面。