【问题标题】:Drive custom SKAction with SKKeyFrameSequence values, how?使用 SKKeyFrameSequence 值驱动自定义 SKAction,如何?
【发布时间】:2017-02-03 19:53:59
【问题描述】:

对于通过自定义 SKAction 完成的运动,我想要一种比传统方程创建曲线更强大的缓动类型。

如何使用 SKKeyFrameSequence 在 SKAction 中驱动动画?

SKKeyFrameSequence 创建我想要的曲线类型,如下所示:

let sequence = SKKeyframeSequence(
    keyframeValues: [0.00, 0.05, 0.25, 0.70, 0.85, 0.95, 0.98, 1.00],
    times:          [0.00, 0.10, 0.15, 0.20, 0.23, 0.28, 0.50, 1.00])

sequence.interpolationMode = .spline
stride(from: 0.00, to: 1.00, by: 0.025).forEach {
let value = sequence.sample(atTime: CGFloat($0))

这看起来像这样,在 PlayGrounds 中创建的曲线上:

自定义类型 SKActions 包含经过的时间和要应用更改的节点。

但我无法想象如何获取 SKKeyFrameSequence 值并将它们放入自定义 SKAction 以转换正在运行自定义操作的节点的位置、旋转或缩放。

SK 自定义动作文档: https://developer.apple.com/reference/spritekit/skaction/1417745-customaction

【问题讨论】:

    标签: swift animation sprite-kit skaction skkeyframesequence


    【解决方案1】:

    要使用自定义操作,您似乎传递了一个将位置设置为customAction(withDuration:actionBlock) 的块:

    let action = SKAction.customAction(withDuration: duration) { node, elapsed in
        node.position.x = sequence.sample(atTime: elapsed/duration)
    }
    

    【讨论】:

    • 也许我已经完成了示例的简单性......如果持续时间不是 1 秒(比如 2 秒),那将如何处理?
    • 啊,太棒了。这是否意味着duration 在关闭范围内?我担心它不会。
    • @Confused 嗯?闭包将捕获duration,因此如果您可以在闭包之外访问它,则可以在闭包内部访问它。
    • 如果可行的话,它比我想象的要好得多,而且容易得多。谢谢!
    • 经过测试...它工作正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2013-05-06
    • 2016-09-22
    相关资源
    最近更新 更多