使用自定义SKAction的EaseOut动作

我有以下自定义SKAction工作,但作为一个EaseIn而不是EaseOut。 我想要它EaseOut! 我很失败地用网上find的各种缓解方程来纠正它。

let duration = 2.0 let initialX = cameraNode.position.x let customEaseOut = SKAction.customActionWithDuration(duration, actionBlock: {node, elapsedTime in let t = Double(elapsedTime)/duration let b = Double(initialX) let c = Double(targetPoint.x) let p = t*t*t*t*t let l = b*(1-p) + c*p node.position.x = CGFloat(l) }) cameraNode.runAction(customEaseOut) 

任何帮助将不胜感激。

谢谢

我们可以修改下面的代码来允许自定义操作缓解,而不是缓解

 let t = Double(elapsedTime)/duration ... let p = t*t*t*t*t 

为了更好地理解p ,将它绘制为t的函数是有帮助的

在这里输入图像说明

很明显,这个function随着时间的推移而减less。 改变t的定义

 let t = 1 - Double(elapsedTime)/duration 

并绘制p给出

在这里输入图像说明

这个动作现在简化了,但是它从1开始到0结束。为了解决这个问题,把p的定义改为

 let p = 1-t*t*t*t*t 

在这里输入图像说明

你不需要计算它。

SKAction只有一个名为timingMode的属性:

 // fall is an SKAction fall.timingMode = .easeInEaseOut 

您可以select:

  • 线性(默认)
  • easeIn
  • easeOut
  • easeInEaseOut

查看来自API文档的细节,也在这里 。

如果您需要更改Apple预设,您可以使用: timingFunction

 fall.timingFunction = { time -> Float in return time } 

根据来源构build一个自定义函数:

 /** A custom timing function for SKActions. Input time will be linear 0.0-1.0 over the duration of the action. Return values must be 0.0-1.0 and increasing and the function must return 1.0 when the input time reaches 1.0. */ public typealias SKActionTimingFunction = (Float) -> Float 

所以有了这些信息,你可以写:

 func CubicEaseOut(_ t:Float)->Float { let f:Float = (t - 1); return f * f * f + 1; } fall.timingFunction = CubicEaseOut