@@ -23,18 +23,38 @@ public final class Physics3DComponent: Component {
2323
2424 public private( set) var xzSpeed : Float = 0
2525
26- public var xzAcceleration : Float ? = nil
27- public var xzDeceleration : Float ? = nil
26+ public var xzAcceleration : Float ? = nil {
27+ didSet {
28+ accelerationAccumulator = 0
29+ }
30+ }
31+ public var xzDeceleration : Float ? = nil {
32+ didSet {
33+ accelerationAccumulator = 0
34+ }
35+ }
36+ var accelerationAccumulator : Float = 0
37+ public private( set) var isAccelerating : Bool = false
2838
2939 public func applyForce( _ force: Float , inDirection direction: Direction3 ) {
3040 self . velocity += direction. normalized * force
3141 }
3242
3343 func update( _ deltaTime: Float ) {
34- if let xzAcceleration = xzAcceleration, velocityXZMagnitude >= xzSpeed {
35- xzSpeed. interpolate ( to: velocityXZMagnitude, . linear( deltaTime * xzAcceleration) )
36- } else if let xzDeceleration = xzDeceleration, velocityXZMagnitude > xzSpeed {
37- xzSpeed. interpolate ( to: velocityXZMagnitude, . linear( deltaTime * xzDeceleration) )
44+ let wasAccelerating = self . isAccelerating
45+ self . isAccelerating = velocityXZMagnitude >= xzSpeed
46+ if wasAccelerating != isAccelerating {
47+ self . accelerationAccumulator = 0
48+ }
49+ self . accelerationAccumulator += deltaTime
50+
51+ if let xzAcceleration = xzAcceleration, xzAcceleration > 0 , self . isAccelerating {
52+ xzSpeed. interpolate ( to: velocityXZMagnitude, . easeIn( max ( 0 , min ( 1 , accelerationAccumulator / xzAcceleration) ) ) )
53+ } else if let xzDeceleration = xzDeceleration, xzDeceleration > 0 , self . isAccelerating == false {
54+ xzSpeed. interpolate ( to: velocityXZMagnitude, . easeOut( max ( 0 , min ( 1 , accelerationAccumulator / xzDeceleration) ) ) )
55+ if xzSpeed < 0.1 {
56+ xzSpeed = 0
57+ }
3858 } else {
3959 xzSpeed = velocityXZMagnitude
4060 }
0 commit comments