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 | ||