diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-12-20 18:57:23 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-12-20 18:57:23 -0500 |
commit | 62069b31c7d23055f999c70a58ccf7d58acd333f (patch) | |
tree | 7ea4c57e74d978a297d34cf61d9c85db846e8900 | |
parent | 90aadf3844386824140a20d7fbb847bc16009a94 (diff) | |
download | therapy-master.tar.gz therapy-master.tar.bz2 therapy-master.zip |
The acceleration of a Ponderable entity is now only really a magnitude. The direction of acceleration is such that the velocity goes toward the target velocity. If accelerating would cause the velocity to pass the target velocity, it is instead set to the target. This is currently being used to 1) generalize terminal velocity due to gravity, and 2) allow an Orientable entity to accelerate quickly to a walking speed (and to a halt) rather than instantly achieve it.
-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 | ||