diff options
| -rw-r--r-- | src/components/ponderable.h | 5 | ||||
| -rw-r--r-- | src/systems/orienting.cpp | 32 | ||||
| -rw-r--r-- | src/systems/playing.cpp | 5 | ||||
| -rw-r--r-- | src/systems/pondering.cpp | 47 |
4 files changed, 61 insertions, 28 deletions
| diff --git a/src/components/ponderable.h b/src/components/ponderable.h index 221d267..cc42048 100644 --- a/src/components/ponderable.h +++ b/src/components/ponderable.h | |||
| @@ -56,6 +56,11 @@ public: | |||
| 56 | vec2d accel = { 0.0, 0.0 }; | 56 | vec2d accel = { 0.0, 0.0 }; |
| 57 | 57 | ||
| 58 | /** | 58 | /** |
| 59 | * The target velocity of the body. | ||
| 60 | */ | ||
| 61 | vec2d targetVel = { 0.0, 0.0 }; | ||
| 62 | |||
| 63 | /** | ||
| 59 | * The type of physical body that the entity is meant to assume. The body will | 64 | * The type of physical body that the entity is meant to assume. The body will |
| 60 | * be acted upon differently based on this. See the enumeration above for more | 65 | * be acted upon differently based on this. See the enumeration above for more |
| 61 | * details. | 66 | * details. |
| diff --git a/src/systems/orienting.cpp b/src/systems/orienting.cpp index d73ddd2..a2be34f 100644 --- a/src/systems/orienting.cpp +++ b/src/systems/orienting.cpp | |||
| @@ -20,30 +20,6 @@ void OrientingSystem::tick(double) | |||
| 20 | auto& ponderable = game_.getEntityManager(). | 20 | auto& ponderable = game_.getEntityManager(). |
| 21 | getComponent<PonderableComponent>(entity); | 21 | getComponent<PonderableComponent>(entity); |
| 22 | 22 | ||
| 23 | switch (orientable.getWalkState()) | ||
| 24 | { | ||
| 25 | case OrientableComponent::WalkState::still: | ||
| 26 | { | ||
| 27 | ponderable.vel.x() = 0.0; | ||
| 28 | |||
| 29 | break; | ||
| 30 | } | ||
| 31 | |||
| 32 | case OrientableComponent::WalkState::left: | ||
| 33 | { | ||
| 34 | ponderable.vel.x() = -WALK_SPEED; | ||
| 35 | |||
| 36 | break; | ||
| 37 | } | ||
| 38 | |||
| 39 | case OrientableComponent::WalkState::right: | ||
| 40 | { | ||
| 41 | ponderable.vel.x() = WALK_SPEED; | ||
| 42 | |||
| 43 | break; | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | if (orientable.isJumping() && (ponderable.vel.y() > 0)) | 23 | if (orientable.isJumping() && (ponderable.vel.y() > 0)) |
| 48 | { | 24 | { |
| 49 | orientable.setJumping(false); | 25 | orientable.setJumping(false); |
| @@ -62,6 +38,8 @@ void OrientingSystem::moveLeft(id_type entity) | |||
| 62 | orientable.setFacingRight(false); | 38 | orientable.setFacingRight(false); |
| 63 | orientable.setWalkState(OrientableComponent::WalkState::left); | 39 | orientable.setWalkState(OrientableComponent::WalkState::left); |
| 64 | 40 | ||
| 41 | ponderable.targetVel.x() = -WALK_SPEED; | ||
| 42 | |||
| 65 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); | 43 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); |
| 66 | if (ponderable.grounded) | 44 | if (ponderable.grounded) |
| 67 | { | 45 | { |
| @@ -82,6 +60,8 @@ void OrientingSystem::moveRight(id_type entity) | |||
| 82 | orientable.setFacingRight(true); | 60 | orientable.setFacingRight(true); |
| 83 | orientable.setWalkState(OrientableComponent::WalkState::right); | 61 | orientable.setWalkState(OrientableComponent::WalkState::right); |
| 84 | 62 | ||
| 63 | ponderable.targetVel.x() = WALK_SPEED; | ||
| 64 | |||
| 85 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); | 65 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); |
| 86 | if (ponderable.grounded) | 66 | if (ponderable.grounded) |
| 87 | { | 67 | { |
| @@ -93,10 +73,14 @@ void OrientingSystem::moveRight(id_type entity) | |||
| 93 | 73 | ||
| 94 | void OrientingSystem::stopWalking(id_type entity) | 74 | void OrientingSystem::stopWalking(id_type entity) |
| 95 | { | 75 | { |
| 76 | auto& ponderable = game_.getEntityManager(). | ||
| 77 | getComponent<PonderableComponent>(entity); | ||
| 78 | |||
| 96 | auto& orientable = game_.getEntityManager(). | 79 | auto& orientable = game_.getEntityManager(). |
| 97 | getComponent<OrientableComponent>(entity); | 80 | getComponent<OrientableComponent>(entity); |
| 98 | 81 | ||
| 99 | orientable.setWalkState(OrientableComponent::WalkState::still); | 82 | orientable.setWalkState(OrientableComponent::WalkState::still); |
| 83 | ponderable.targetVel.x() = 0; | ||
| 100 | 84 | ||
| 101 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); | 85 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); |
| 102 | 86 | ||
| diff --git a/src/systems/playing.cpp b/src/systems/playing.cpp index 6652099..83f65d6 100644 --- a/src/systems/playing.cpp +++ b/src/systems/playing.cpp | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include "components/playable.h" | 5 | #include "components/playable.h" |
| 6 | #include "components/controllable.h" | 6 | #include "components/controllable.h" |
| 7 | #include "components/orientable.h" | 7 | #include "components/orientable.h" |
| 8 | #include "components/ponderable.h" | ||
| 8 | #include "systems/mapping.h" | 9 | #include "systems/mapping.h" |
| 9 | #include "systems/pondering.h" | 10 | #include "systems/pondering.h" |
| 10 | #include "systems/orienting.h" | 11 | #include "systems/orienting.h" |
| @@ -46,6 +47,10 @@ void PlayingSystem::initPlayer() | |||
| 46 | player, | 47 | player, |
| 47 | PonderableComponent::Type::freefalling); | 48 | PonderableComponent::Type::freefalling); |
| 48 | 49 | ||
| 50 | auto& ponderable = game_.getEntityManager(). | ||
| 51 | getComponent<PonderableComponent>(player); | ||
| 52 | ponderable.accel.x() = 720; | ||
| 53 | |||
| 49 | game_.getEntityManager().emplaceComponent<ControllableComponent>(player); | 54 | game_.getEntityManager().emplaceComponent<ControllableComponent>(player); |
| 50 | game_.getEntityManager().emplaceComponent<OrientableComponent>(player); | 55 | game_.getEntityManager().emplaceComponent<OrientableComponent>(player); |
| 51 | 56 | ||
| 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 | ||
