summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/components/ponderable.h5
-rw-r--r--src/systems/orienting.cpp32
-rw-r--r--src/systems/playing.cpp5
-rw-r--r--src/systems/pondering.cpp47
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
94void OrientingSystem::stopWalking(id_type entity) 74void 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