Skip to content

Commit c21b1c6

Browse files
committed
Rework acceleration/deceleration
1 parent 6361491 commit c21b1c6

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

Sources/GateEngine/ECS/3D Specific/Physics/Physics3DComponent.swift

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)