diff options
Diffstat (limited to 'src/systems/pondering.cpp')
| -rw-r--r-- | src/systems/pondering.cpp | 47 |
1 files changed, 43 insertions, 4 deletions
| diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index d841679..649a03a 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp | |||
| @@ -44,6 +44,7 @@ void PonderingSystem::initializeBody( | |||
| 44 | 44 | ||
| 45 | if (type == PonderableComponent::Type::freefalling) | 45 | if (type == PonderableComponent::Type::freefalling) |
| 46 | { | 46 | { |
| 47 | ponderable.targetVel.y() = TERMINAL_VELOCITY; | ||
| 47 | ponderable.accel.y() = NORMAL_GRAVITY; | 48 | ponderable.accel.y() = NORMAL_GRAVITY; |
| 48 | } | 49 | } |
| 49 | } | 50 | } |
| @@ -57,6 +58,8 @@ void PonderingSystem::initPrototype(id_type prototype) | |||
| 57 | ponderable.vel.y() = 0.0; | 58 | ponderable.vel.y() = 0.0; |
| 58 | ponderable.accel.x() = 0.0; | 59 | ponderable.accel.x() = 0.0; |
| 59 | ponderable.accel.y() = 0.0; | 60 | ponderable.accel.y() = 0.0; |
| 61 | ponderable.targetVel.x() = 0.0; | ||
| 62 | ponderable.targetVel.y() = 0.0; | ||
| 60 | ponderable.grounded = false; | 63 | ponderable.grounded = false; |
| 61 | ponderable.frozen = false; | 64 | ponderable.frozen = false; |
| 62 | ponderable.collidable = true; | 65 | ponderable.collidable = true; |
| @@ -98,12 +101,48 @@ void PonderingSystem::tickBody( | |||
| 98 | // Accelerate | 101 | // Accelerate |
| 99 | if (!ponderable.frozen) | 102 | if (!ponderable.frozen) |
| 100 | { | 103 | { |
| 101 | ponderable.vel += ponderable.accel * dt; | 104 | // Determine the effective acceleration, which should be in the direction of |
| 105 | // the target velocity. | ||
| 106 | vec2d effAcc = ponderable.accel; | ||
| 102 | 107 | ||
| 103 | if ((ponderable.type == PonderableComponent::Type::freefalling) | 108 | if (ponderable.vel.x() == ponderable.targetVel.x()) |
| 104 | && (ponderable.vel.y() > TERMINAL_VELOCITY)) | ||
| 105 | { | 109 | { |
| 106 | ponderable.vel.y() = TERMINAL_VELOCITY; | 110 | effAcc.x() = 0.0; |
| 111 | } | ||
| 112 | else if ((ponderable.accel.x() > 0 && | ||
| 113 | ponderable.targetVel.x() < ponderable.vel.x()) || | ||
| 114 | (ponderable.accel.x() < 0 && | ||
| 115 | ponderable.targetVel.x() > ponderable.vel.x())) | ||
| 116 | { | ||
| 117 | effAcc.x() = -effAcc.x(); | ||
| 118 | } | ||
| 119 | |||
| 120 | if (ponderable.vel.y() == ponderable.targetVel.y()) | ||
| 121 | { | ||
| 122 | effAcc.y() = 0.0; | ||
| 123 | } | ||
| 124 | else if ((ponderable.accel.y() > 0 && | ||
| 125 | ponderable.targetVel.y() < ponderable.vel.y()) || | ||
| 126 | (ponderable.accel.y() < 0 && | ||
| 127 | ponderable.targetVel.y() > ponderable.vel.y())) | ||
| 128 | { | ||
| 129 | effAcc.y() = -effAcc.y(); | ||
| 130 | } | ||
| 131 | |||
| 132 | // Accelerate | ||
| 133 | ponderable.vel += effAcc * dt; | ||
| 134 | |||
| 135 | // If the velocity crossed the target velocity, set it to the target | ||
| 136 | if ((effAcc.x() > 0 && ponderable.vel.x() > ponderable.targetVel.x()) || | ||
| 137 | (effAcc.x() < 0 && ponderable.vel.x() < ponderable.targetVel.x())) | ||
| 138 | { | ||
| 139 | ponderable.vel.x() = ponderable.targetVel.x(); | ||
| 140 | } | ||
| 141 | |||
| 142 | if ((effAcc.y() > 0 && ponderable.vel.y() > ponderable.targetVel.y()) || | ||
| 143 | (effAcc.y() < 0 && ponderable.vel.y() < ponderable.targetVel.y())) | ||
| 144 | { | ||
| 145 | ponderable.vel.y() = ponderable.targetVel.y(); | ||
| 107 | } | 146 | } |
| 108 | } | 147 | } |
| 109 | 148 | ||
