Peoplemon  0.1.0
Peoplemon 3 game source documentation
Movable.cpp
Go to the documentation of this file.
2 
5 #include <Core/Properties.hpp>
7 
8 namespace core
9 {
10 namespace component
11 {
12 namespace
13 {
14 constexpr float HopDistance = 64.f;
15 constexpr float HopHeight = 20.f;
16 constexpr float MaxHeightPoint = 0.25f;
17 constexpr float HopUpHeightMult = 1.f / MaxHeightPoint;
18 constexpr float HopDownHeightMult = 1.f / (1.f - MaxHeightPoint);
19 constexpr float ShadowSize = 16.f;
20 constexpr float ShadowShrinkage = 3.f;
21 
22 glm::vec2 getPixels(bl::tmap::Direction dir, float x, float y, float interp) {
23  switch (dir) {
24  case bl::tmap::Direction::Up:
25  return {x, y + interp};
26  case bl::tmap::Direction::Right:
27  return {x - interp, y};
28  case bl::tmap::Direction::Down:
29  return {x, y - interp};
30  case bl::tmap::Direction::Left:
31  default:
32  return {x + interp, y};
33  }
34 }
35 } // namespace
36 
37 Movable::Movable(bl::tmap::Position& pos, float speed, float fastSpeed)
38 : position(pos)
39 , movementSpeed(speed)
40 , fastMovementSpeed(fastSpeed)
41 , state(MoveState::Still) {}
42 
43 bool Movable::moving() const { return state != MoveState::Still; }
44 
45 bool Movable::goingFast() const { return state == MoveState::MovingFast; }
46 
47 void Movable::move(bl::tmap::Direction dir, bool fast, bool isHop) {
48  moveDir = dir;
49  state = fast ? MoveState::MovingFast : (isHop ? MoveState::LedgeHopping : MoveState::Moving);
50  interpRemaining = static_cast<float>(Properties::PixelsPerTile()) * (isHop ? 2.f : 1.f);
51 }
52 
53 void Movable::update(bl::ecs::Entity owner, system::Systems& systems, float dt) {
54  if (state != MoveState::Still) {
55  if (!position.transform) {
56  BL_LOG_WARN << "Entity with movable component missing transform: " << owner;
57  return;
58  }
59 
60  if (state != MoveState::LedgeHopping) {
61  // interpolate
62  const float speed = state == MoveState::MovingFast ? fastMovementSpeed : movementSpeed;
63  const float displacement = dt * speed;
64  interpRemaining = std::max(interpRemaining - displacement, 0.f);
65 
66  // set render pos
67  const float xTile = position.position.x * Properties::PixelsPerTile();
68  const float yTile = position.position.y * Properties::PixelsPerTile();
69  position.transform->setPosition(getPixels(moveDir, xTile, yTile, interpRemaining));
70 
71  if (interpRemaining <= 0.f) {
72  position.syncTransform(Properties::PixelsPerTile());
73  state = MoveState::Still;
74  bl::event::Dispatcher::dispatch<event::EntityMoveFinished>({owner, position});
75  }
76  }
77  else {
78  interpRemaining = std::max(interpRemaining - movementSpeed * dt, 0.f);
79  const float percent = 1.f - interpRemaining / HopDistance;
80  const float hp = percent <= MaxHeightPoint ?
81  percent * HopUpHeightMult :
82  1.f - (percent - MaxHeightPoint) * HopDownHeightMult;
83  const float height = HopHeight * hp;
84 
85  // update shadow
86  systems.render().updateShadow(
87  systems.player().player(), height, ShadowSize - ShadowShrinkage * hp);
88 
89  // set render pos
90  const float xTile = position.position.x * Properties::PixelsPerTile();
91  const float yTile = position.position.y * Properties::PixelsPerTile();
92  position.transform->setPosition(xTile, yTile - interpRemaining - height);
93 
94  // check finished
95  if (interpRemaining <= 0.f) {
96  position.syncTransform(Properties::PixelsPerTile());
97  state = MoveState::Still;
98  bl::event::Dispatcher::dispatch<event::EntityMoveFinished>({owner, position});
99  systems.render().removeShadow(owner);
100  }
101  }
102  }
103 }
104 
105 } // namespace component
106 } // namespace core
Core classes and functionality for both the editor and game.
bool goingFast() const
Returns whether or not the entity is going fast.
Definition: Movable.cpp:45
bool moving() const
Returns whether or not the entity is moving.
Definition: Movable.cpp:43
void update(bl::ecs::Entity owner, system::Systems &systems, float dt)
Updates the interpolation of the entity if moving.
Definition: Movable.cpp:53
Movable(bl::tmap::Position &pos, float speed, float fastSpeed)
Construct a new Movable component.
Definition: Movable.cpp:37
void move(bl::tmap::Direction dir, bool fast, bool isLedgeHop)
Starts the entity moving in the given direction. Only updates the interpolated position,...
Definition: Movable.cpp:47
static int PixelsPerTile()
Definition: Properties.cpp:279
bl::ecs::Entity player() const
Returns the id of the player entity.
Definition: Player.cpp:55
void removeShadow(bl::ecs::Entity entity)
Removes the shadow from the given entity.
Definition: Render.cpp:97
void updateShadow(bl::ecs::Entity entity, float distance, float radius)
Adds or updates the shadow of the given entity.
Definition: Render.cpp:58
Owns all primary systems and a reference to the engine.
Definition: Systems.hpp:47
Render & render()
Returns the render system.
Definition: Systems.cpp:87
Player & player()
Returns the player system.
Definition: Systems.cpp:59