diff options
| -rw-r--r-- | src/components/automatable.h | 4 | ||||
| -rw-r--r-- | src/components/playable.h | 4 | ||||
| -rw-r--r-- | src/components/ponderable.h | 10 | ||||
| -rw-r--r-- | src/components/realizable.h | 4 | ||||
| -rw-r--r-- | src/components/transformable.h | 13 | ||||
| -rw-r--r-- | src/systems/animating.cpp | 8 | ||||
| -rw-r--r-- | src/systems/automating.cpp | 3 | ||||
| -rw-r--r-- | src/systems/orienting.cpp | 14 | ||||
| -rw-r--r-- | src/systems/playing.cpp | 19 | ||||
| -rw-r--r-- | src/systems/playing.h | 4 | ||||
| -rw-r--r-- | src/systems/pondering.cpp | 294 | ||||
| -rw-r--r-- | src/systems/pondering.h | 34 | ||||
| -rw-r--r-- | src/systems/realizing.cpp | 38 | ||||
| -rw-r--r-- | src/vector.h | 111 |
14 files changed, 285 insertions, 275 deletions
| diff --git a/src/components/automatable.h b/src/components/automatable.h index b37945f..c1fd1a3 100644 --- a/src/components/automatable.h +++ b/src/components/automatable.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include "component.h" | 4 | #include "component.h" |
| 5 | #include <vector> | 5 | #include <vector> |
| 6 | #include <random> | 6 | #include <random> |
| 7 | #include "vector.h" | ||
| 7 | 8 | ||
| 8 | class AutomatableComponent : public Component { | 9 | class AutomatableComponent : public Component { |
| 9 | public: | 10 | public: |
| @@ -18,8 +19,7 @@ public: | |||
| 18 | * The horizontal and vertical speed, in pixels/sec, that the entity should | 19 | * The horizontal and vertical speed, in pixels/sec, that the entity should |
| 19 | * move at. | 20 | * move at. |
| 20 | */ | 21 | */ |
| 21 | double speedX; | 22 | vec2d speed; |
| 22 | double speedY; | ||
| 23 | 23 | ||
| 24 | /** | 24 | /** |
| 25 | * The duration of the action in seconds. | 25 | * The duration of the action in seconds. |
| diff --git a/src/components/playable.h b/src/components/playable.h index 94d4326..b8af0f2 100644 --- a/src/components/playable.h +++ b/src/components/playable.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include "component.h" | 4 | #include "component.h" |
| 5 | #include "entity_manager.h" | 5 | #include "entity_manager.h" |
| 6 | #include "vector.h" | ||
| 6 | 7 | ||
| 7 | class PlayableComponent : public Component { | 8 | class PlayableComponent : public Component { |
| 8 | public: | 9 | public: |
| @@ -24,8 +25,7 @@ public: | |||
| 24 | * @managed_by PlayingSystem | 25 | * @managed_by PlayingSystem |
| 25 | */ | 26 | */ |
| 26 | size_t checkpointMapId; | 27 | size_t checkpointMapId; |
| 27 | double checkpointX; | 28 | vec2d checkpointPos; |
| 28 | double checkpointY; | ||
| 29 | 29 | ||
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| diff --git a/src/components/ponderable.h b/src/components/ponderable.h index eff20e9..c0312b4 100644 --- a/src/components/ponderable.h +++ b/src/components/ponderable.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include <set> | 4 | #include <set> |
| 5 | #include "component.h" | 5 | #include "component.h" |
| 6 | #include "entity_manager.h" | 6 | #include "entity_manager.h" |
| 7 | #include "vector.h" | ||
| 7 | 8 | ||
| 8 | class PonderableComponent : public Component { | 9 | class PonderableComponent : public Component { |
| 9 | public: | 10 | public: |
| @@ -45,14 +46,12 @@ public: | |||
| 45 | /** | 46 | /** |
| 46 | * The velocity of the body. | 47 | * The velocity of the body. |
| 47 | */ | 48 | */ |
| 48 | double velX = 0.0; | 49 | vec2d vel = { 0.0, 0.0 }; |
| 49 | double velY = 0.0; | ||
| 50 | 50 | ||
| 51 | /** | 51 | /** |
| 52 | * The acceleration of the body. | 52 | * The acceleration of the body. |
| 53 | */ | 53 | */ |
| 54 | double accelX = 0.0; | 54 | vec2d accel = { 0.0, 0.0 }; |
| 55 | double accelY = 0.0; | ||
| 56 | 55 | ||
| 57 | /** | 56 | /** |
| 58 | * The type of physical body that the entity is meant to assume. The body will | 57 | * The type of physical body that the entity is meant to assume. The body will |
| @@ -89,8 +88,7 @@ public: | |||
| 89 | * | 88 | * |
| 90 | * @managed_by PonderingSystem | 89 | * @managed_by PonderingSystem |
| 91 | */ | 90 | */ |
| 92 | double relX; | 91 | vec2d rel = { 0.0, 0.0 }; |
| 93 | double relY; | ||
| 94 | 92 | ||
| 95 | /** | 93 | /** |
| 96 | * The bodies that are being ferried by this body. | 94 | * The bodies that are being ferried by this body. |
| diff --git a/src/components/realizable.h b/src/components/realizable.h index 0858e7a..b749aeb 100644 --- a/src/components/realizable.h +++ b/src/components/realizable.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <set> | 5 | #include <set> |
| 6 | #include <map> | 6 | #include <map> |
| 7 | #include "entity_manager.h" | 7 | #include "entity_manager.h" |
| 8 | #include "vector.h" | ||
| 8 | 9 | ||
| 9 | class RealizableComponent : public Component { | 10 | class RealizableComponent : public Component { |
| 10 | public: | 11 | public: |
| @@ -31,8 +32,7 @@ public: | |||
| 31 | * @managed_by RealizingSystem | 32 | * @managed_by RealizingSystem |
| 32 | */ | 33 | */ |
| 33 | int startingMapId; | 34 | int startingMapId; |
| 34 | int startingX; | 35 | vec2i startingPos; |
| 35 | int startingY; | ||
| 36 | 36 | ||
| 37 | /** | 37 | /** |
| 38 | * The set of map entities loaded by this entity. It is only intended for | 38 | * The set of map entities loaded by this entity. It is only intended for |
| diff --git a/src/components/transformable.h b/src/components/transformable.h index 6f3c2ef..bb21996 100644 --- a/src/components/transformable.h +++ b/src/components/transformable.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define LOCATABLE_H_39E526CA | 2 | #define LOCATABLE_H_39E526CA |
| 3 | 3 | ||
| 4 | #include "component.h" | 4 | #include "component.h" |
| 5 | #include "vector.h" | ||
| 5 | 6 | ||
| 6 | class TransformableComponent : public Component { | 7 | class TransformableComponent : public Component { |
| 7 | public: | 8 | public: |
| @@ -15,24 +16,20 @@ public: | |||
| 15 | * so, use PonderingSystem::unferry on the body to ensure that it is not | 16 | * so, use PonderingSystem::unferry on the body to ensure that it is not |
| 16 | * ferried. | 17 | * ferried. |
| 17 | */ | 18 | */ |
| 18 | double x; | 19 | vec2d pos; |
| 19 | double y; | ||
| 20 | 20 | ||
| 21 | /** | 21 | /** |
| 22 | * The size of the entity. | 22 | * The size of the entity. |
| 23 | */ | 23 | */ |
| 24 | int w; | 24 | vec2i size; |
| 25 | int h; | ||
| 26 | 25 | ||
| 27 | /** | 26 | /** |
| 28 | * For prototypes, the original coordinates and size of the entity. | 27 | * For prototypes, the original coordinates and size of the entity. |
| 29 | * | 28 | * |
| 30 | * @managed_by RealizingSystem | 29 | * @managed_by RealizingSystem |
| 31 | */ | 30 | */ |
| 32 | double origX; | 31 | vec2d origPos; |
| 33 | double origY; | 32 | vec2i origSize; |
| 34 | int origW; | ||
| 35 | int origH; | ||
| 36 | }; | 33 | }; |
| 37 | 34 | ||
| 38 | #endif /* end of include guard: LOCATABLE_H_39E526CA */ | 35 | #endif /* end of include guard: LOCATABLE_H_39E526CA */ |
| diff --git a/src/systems/animating.cpp b/src/systems/animating.cpp index 8543ba2..50a32fc 100644 --- a/src/systems/animating.cpp +++ b/src/systems/animating.cpp | |||
| @@ -64,10 +64,10 @@ void AnimatingSystem::render(Texture& texture) | |||
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | Rectangle dstrect { | 66 | Rectangle dstrect { |
| 67 | static_cast<int>(transform.x), | 67 | static_cast<int>(transform.pos.x()), |
| 68 | static_cast<int>(transform.y), | 68 | static_cast<int>(transform.pos.y()), |
| 69 | transform.w, | 69 | transform.size.w(), |
| 70 | transform.h}; | 70 | transform.size.h()}; |
| 71 | 71 | ||
| 72 | const AnimationSet& aset = sprite.animationSet; | 72 | const AnimationSet& aset = sprite.animationSet; |
| 73 | game_.getRenderer().blit( | 73 | game_.getRenderer().blit( |
| diff --git a/src/systems/automating.cpp b/src/systems/automating.cpp index 0d85957..61b97d9 100644 --- a/src/systems/automating.cpp +++ b/src/systems/automating.cpp | |||
| @@ -54,8 +54,7 @@ void AutomatingSystem::tick(double dt) | |||
| 54 | auto& ponderable = game_.getEntityManager(). | 54 | auto& ponderable = game_.getEntityManager(). |
| 55 | getComponent<PonderableComponent>(entity); | 55 | getComponent<PonderableComponent>(entity); |
| 56 | 56 | ||
| 57 | ponderable.velX = curAction.speedX; | 57 | ponderable.vel = curAction.speed; |
| 58 | ponderable.velY = curAction.speedY; | ||
| 59 | 58 | ||
| 60 | automatable.remaining -= dt; | 59 | automatable.remaining -= dt; |
| 61 | } | 60 | } |
| diff --git a/src/systems/orienting.cpp b/src/systems/orienting.cpp index 206ebf6..d73ddd2 100644 --- a/src/systems/orienting.cpp +++ b/src/systems/orienting.cpp | |||
| @@ -24,27 +24,27 @@ void OrientingSystem::tick(double) | |||
| 24 | { | 24 | { |
| 25 | case OrientableComponent::WalkState::still: | 25 | case OrientableComponent::WalkState::still: |
| 26 | { | 26 | { |
| 27 | ponderable.velX = 0.0; | 27 | ponderable.vel.x() = 0.0; |
| 28 | 28 | ||
| 29 | break; | 29 | break; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | case OrientableComponent::WalkState::left: | 32 | case OrientableComponent::WalkState::left: |
| 33 | { | 33 | { |
| 34 | ponderable.velX = -WALK_SPEED; | 34 | ponderable.vel.x() = -WALK_SPEED; |
| 35 | 35 | ||
| 36 | break; | 36 | break; |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | case OrientableComponent::WalkState::right: | 39 | case OrientableComponent::WalkState::right: |
| 40 | { | 40 | { |
| 41 | ponderable.velX = WALK_SPEED; | 41 | ponderable.vel.x() = WALK_SPEED; |
| 42 | 42 | ||
| 43 | break; | 43 | break; |
| 44 | } | 44 | } |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | if (orientable.isJumping() && (ponderable.velY > 0)) | 47 | if (orientable.isJumping() && (ponderable.vel.y() > 0)) |
| 48 | { | 48 | { |
| 49 | orientable.setJumping(false); | 49 | orientable.setJumping(false); |
| 50 | } | 50 | } |
| @@ -122,8 +122,8 @@ void OrientingSystem::jump(id_type entity) | |||
| 122 | 122 | ||
| 123 | playSound("res/Randomize87.wav", 0.25); | 123 | playSound("res/Randomize87.wav", 0.25); |
| 124 | 124 | ||
| 125 | ponderable.velY = JUMP_VELOCITY; | 125 | ponderable.vel.y() = JUMP_VELOCITY; |
| 126 | ponderable.accelY = JUMP_GRAVITY; | 126 | ponderable.accel.y() = JUMP_GRAVITY; |
| 127 | 127 | ||
| 128 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); | 128 | auto& animating = game_.getSystemManager().getSystem<AnimatingSystem>(); |
| 129 | if (orientable.isFacingRight()) | 129 | if (orientable.isFacingRight()) |
| @@ -147,7 +147,7 @@ void OrientingSystem::stopJumping(id_type entity) | |||
| 147 | auto& ponderable = game_.getEntityManager(). | 147 | auto& ponderable = game_.getEntityManager(). |
| 148 | getComponent<PonderableComponent>(entity); | 148 | getComponent<PonderableComponent>(entity); |
| 149 | 149 | ||
| 150 | ponderable.accelY = NORMAL_GRAVITY; | 150 | ponderable.accel.y() = NORMAL_GRAVITY; |
| 151 | } | 151 | } |
| 152 | } | 152 | } |
| 153 | 153 | ||
| diff --git a/src/systems/playing.cpp b/src/systems/playing.cpp index acec4e7..dabc9a5 100644 --- a/src/systems/playing.cpp +++ b/src/systems/playing.cpp | |||
| @@ -42,10 +42,9 @@ void PlayingSystem::initPlayer() | |||
| 42 | auto& transformable = game_.getEntityManager(). | 42 | auto& transformable = game_.getEntityManager(). |
| 43 | emplaceComponent<TransformableComponent>(player); | 43 | emplaceComponent<TransformableComponent>(player); |
| 44 | 44 | ||
| 45 | transformable.x = realizable.startingX; | 45 | transformable.pos = realizable.startingPos; |
| 46 | transformable.y = realizable.startingY; | 46 | transformable.size.w() = 10; |
| 47 | transformable.w = 10; | 47 | transformable.size.h() = 12; |
| 48 | transformable.h = 12; | ||
| 49 | 48 | ||
| 50 | game_.getSystemManager().getSystem<PonderingSystem>().initializeBody( | 49 | game_.getSystemManager().getSystem<PonderingSystem>().initializeBody( |
| 51 | player, | 50 | player, |
| @@ -59,8 +58,7 @@ void PlayingSystem::initPlayer() | |||
| 59 | 58 | ||
| 60 | playable.mapId = realizable.activeMap; | 59 | playable.mapId = realizable.activeMap; |
| 61 | playable.checkpointMapId = realizable.startingMapId; | 60 | playable.checkpointMapId = realizable.startingMapId; |
| 62 | playable.checkpointX = realizable.startingX; | 61 | playable.checkpointPos = realizable.startingPos; |
| 63 | playable.checkpointY = realizable.startingY; | ||
| 64 | 62 | ||
| 65 | realizing.enterActiveMap(player); | 63 | realizing.enterActiveMap(player); |
| 66 | 64 | ||
| @@ -70,8 +68,7 @@ void PlayingSystem::initPlayer() | |||
| 70 | void PlayingSystem::changeMap( | 68 | void PlayingSystem::changeMap( |
| 71 | id_type player, | 69 | id_type player, |
| 72 | size_t mapId, | 70 | size_t mapId, |
| 73 | double x, | 71 | vec2d warpPos) |
| 74 | double y) | ||
| 75 | { | 72 | { |
| 76 | auto& playable = game_.getEntityManager(). | 73 | auto& playable = game_.getEntityManager(). |
| 77 | getComponent<PlayableComponent>(player); | 74 | getComponent<PlayableComponent>(player); |
| @@ -103,8 +100,7 @@ void PlayingSystem::changeMap( | |||
| 103 | 100 | ||
| 104 | pondering.unferry(player); | 101 | pondering.unferry(player); |
| 105 | 102 | ||
| 106 | transformable.x = x; | 103 | transformable.pos = warpPos; |
| 107 | transformable.y = y; | ||
| 108 | 104 | ||
| 109 | if (realizable.activePlayer == player) | 105 | if (realizable.activePlayer == player) |
| 110 | { | 106 | { |
| @@ -139,8 +135,7 @@ void PlayingSystem::die(id_type player) | |||
| 139 | changeMap( | 135 | changeMap( |
| 140 | player, | 136 | player, |
| 141 | playable.checkpointMapId, | 137 | playable.checkpointMapId, |
| 142 | playable.checkpointX, | 138 | playable.checkpointPos); |
| 143 | playable.checkpointY); | ||
| 144 | 139 | ||
| 145 | animatable.frozen = false; | 140 | animatable.frozen = false; |
| 146 | animatable.flickering = false; | 141 | animatable.flickering = false; |
| diff --git a/src/systems/playing.h b/src/systems/playing.h index 9ba403b..31f79ab 100644 --- a/src/systems/playing.h +++ b/src/systems/playing.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define PLAYING_H_70A54F7D | 2 | #define PLAYING_H_70A54F7D |
| 3 | 3 | ||
| 4 | #include "system.h" | 4 | #include "system.h" |
| 5 | #include "vector.h" | ||
| 5 | 6 | ||
| 6 | class PlayingSystem : public System { | 7 | class PlayingSystem : public System { |
| 7 | public: | 8 | public: |
| @@ -15,8 +16,7 @@ public: | |||
| 15 | void changeMap( | 16 | void changeMap( |
| 16 | id_type player, | 17 | id_type player, |
| 17 | size_t mapId, | 18 | size_t mapId, |
| 18 | double x, | 19 | vec2d warpPos); |
| 19 | double y); | ||
| 20 | 20 | ||
| 21 | void die(id_type player); | 21 | void die(id_type player); |
| 22 | 22 | ||
| diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index 7b3ab2d..ec83270 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp | |||
| @@ -47,7 +47,7 @@ void PonderingSystem::initializeBody( | |||
| 47 | 47 | ||
| 48 | if (type == PonderableComponent::Type::freefalling) | 48 | if (type == PonderableComponent::Type::freefalling) |
| 49 | { | 49 | { |
| 50 | ponderable.accelY = NORMAL_GRAVITY; | 50 | ponderable.accel.y() = NORMAL_GRAVITY; |
| 51 | } | 51 | } |
| 52 | } | 52 | } |
| 53 | 53 | ||
| @@ -56,10 +56,10 @@ void PonderingSystem::initPrototype(id_type prototype) | |||
| 56 | auto& ponderable = game_.getEntityManager(). | 56 | auto& ponderable = game_.getEntityManager(). |
| 57 | getComponent<PonderableComponent>(prototype); | 57 | getComponent<PonderableComponent>(prototype); |
| 58 | 58 | ||
| 59 | ponderable.velX = 0.0; | 59 | ponderable.vel.x() = 0.0; |
| 60 | ponderable.velY = 0.0; | 60 | ponderable.vel.y() = 0.0; |
| 61 | ponderable.accelX = 0.0; | 61 | ponderable.accel.x() = 0.0; |
| 62 | ponderable.accelY = 0.0; | 62 | ponderable.accel.y() = 0.0; |
| 63 | ponderable.grounded = false; | 63 | ponderable.grounded = false; |
| 64 | ponderable.frozen = false; | 64 | ponderable.frozen = false; |
| 65 | ponderable.collidable = true; | 65 | ponderable.collidable = true; |
| @@ -102,19 +102,17 @@ void PonderingSystem::tickBody( | |||
| 102 | // Accelerate | 102 | // Accelerate |
| 103 | if (!ponderable.frozen) | 103 | if (!ponderable.frozen) |
| 104 | { | 104 | { |
| 105 | ponderable.velX += ponderable.accelX * dt; | 105 | ponderable.vel += ponderable.accel * dt; |
| 106 | ponderable.velY += ponderable.accelY * dt; | ||
| 107 | 106 | ||
| 108 | if ((ponderable.type == PonderableComponent::Type::freefalling) | 107 | if ((ponderable.type == PonderableComponent::Type::freefalling) |
| 109 | && (ponderable.velY > TERMINAL_VELOCITY)) | 108 | && (ponderable.vel.y() > TERMINAL_VELOCITY)) |
| 110 | { | 109 | { |
| 111 | ponderable.velY = TERMINAL_VELOCITY; | 110 | ponderable.vel.y() = TERMINAL_VELOCITY; |
| 112 | } | 111 | } |
| 113 | } | 112 | } |
| 114 | 113 | ||
| 115 | // Move | 114 | // Move |
| 116 | double newX = transformable.x; | 115 | vec2d newPos = transformable.pos; |
| 117 | double newY = transformable.y; | ||
| 118 | 116 | ||
| 119 | if (!ponderable.frozen) | 117 | if (!ponderable.frozen) |
| 120 | { | 118 | { |
| @@ -123,19 +121,13 @@ void PonderingSystem::tickBody( | |||
| 123 | auto& ferryTrans = game_.getEntityManager(). | 121 | auto& ferryTrans = game_.getEntityManager(). |
| 124 | getComponent<TransformableComponent>(ponderable.ferry); | 122 | getComponent<TransformableComponent>(ponderable.ferry); |
| 125 | 123 | ||
| 126 | newX = ferryTrans.x + ponderable.relX; | 124 | newPos = ferryTrans.pos + ponderable.rel; |
| 127 | newY = ferryTrans.y + ponderable.relY; | ||
| 128 | } | 125 | } |
| 129 | 126 | ||
| 130 | newX += ponderable.velX * dt; | 127 | newPos += ponderable.vel * dt; |
| 131 | newY += ponderable.velY * dt; | ||
| 132 | } | 128 | } |
| 133 | 129 | ||
| 134 | CollisionResult result = | 130 | CollisionResult result = moveBody(entity, newPos); |
| 135 | moveBody( | ||
| 136 | entity, | ||
| 137 | newX, | ||
| 138 | newY); | ||
| 139 | 131 | ||
| 140 | // Perform cleanup for orientable entites | 132 | // Perform cleanup for orientable entites |
| 141 | bool groundedChanged = (ponderable.grounded != result.grounded); | 133 | bool groundedChanged = (ponderable.grounded != result.grounded); |
| @@ -194,8 +186,7 @@ void PonderingSystem::tickBody( | |||
| 194 | auto& ferryTrans = game_.getEntityManager(). | 186 | auto& ferryTrans = game_.getEntityManager(). |
| 195 | getComponent<TransformableComponent>(ponderable.ferry); | 187 | getComponent<TransformableComponent>(ponderable.ferry); |
| 196 | 188 | ||
| 197 | ponderable.relX = transformable.x - ferryTrans.x; | 189 | ponderable.rel = transformable.pos - ferryTrans.pos; |
| 198 | ponderable.relY = transformable.y - ferryTrans.y; | ||
| 199 | } | 190 | } |
| 200 | 191 | ||
| 201 | // Handle ferry passengers | 192 | // Handle ferry passengers |
| @@ -212,35 +203,34 @@ void PonderingSystem::tickBody( | |||
| 212 | // Move to an adjacent map, if necessary | 203 | // Move to an adjacent map, if necessary |
| 213 | if (result.adjacentlyWarping) | 204 | if (result.adjacentlyWarping) |
| 214 | { | 205 | { |
| 215 | double warpX = result.newX; | 206 | vec2d warpPos = result.pos; |
| 216 | double warpY = result.newY; | ||
| 217 | 207 | ||
| 218 | switch (result.adjWarpDir) | 208 | switch (result.adjWarpDir) |
| 219 | { | 209 | { |
| 220 | case Direction::left: | 210 | case Direction::left: |
| 221 | { | 211 | { |
| 222 | warpX = GAME_WIDTH + WALL_GAP - transformable.w; | 212 | warpPos.x() = GAME_WIDTH + WALL_GAP - transformable.size.w(); |
| 223 | 213 | ||
| 224 | break; | 214 | break; |
| 225 | } | 215 | } |
| 226 | 216 | ||
| 227 | case Direction::right: | 217 | case Direction::right: |
| 228 | { | 218 | { |
| 229 | warpX = -WALL_GAP; | 219 | warpPos.x() = -WALL_GAP; |
| 230 | 220 | ||
| 231 | break; | 221 | break; |
| 232 | } | 222 | } |
| 233 | 223 | ||
| 234 | case Direction::up: | 224 | case Direction::up: |
| 235 | { | 225 | { |
| 236 | warpY = MAP_HEIGHT * TILE_HEIGHT - transformable.h; | 226 | warpPos.y() = MAP_HEIGHT * TILE_HEIGHT - transformable.size.h(); |
| 237 | 227 | ||
| 238 | break; | 228 | break; |
| 239 | } | 229 | } |
| 240 | 230 | ||
| 241 | case Direction::down: | 231 | case Direction::down: |
| 242 | { | 232 | { |
| 243 | warpY = -WALL_GAP; | 233 | warpPos.y() = -WALL_GAP; |
| 244 | 234 | ||
| 245 | break; | 235 | break; |
| 246 | } | 236 | } |
| @@ -250,15 +240,13 @@ void PonderingSystem::tickBody( | |||
| 250 | changeMap( | 240 | changeMap( |
| 251 | entity, | 241 | entity, |
| 252 | result.adjWarpMapId, | 242 | result.adjWarpMapId, |
| 253 | warpX, | 243 | warpPos); |
| 254 | warpY); | ||
| 255 | } | 244 | } |
| 256 | } | 245 | } |
| 257 | 246 | ||
| 258 | CollisionResult PonderingSystem::moveBody( | 247 | PonderingSystem::CollisionResult PonderingSystem::moveBody( |
| 259 | id_type entity, | 248 | id_type entity, |
| 260 | double x, | 249 | vec2d newPos) |
| 261 | double y) | ||
| 262 | { | 250 | { |
| 263 | auto& ponderable = game_.getEntityManager(). | 251 | auto& ponderable = game_.getEntityManager(). |
| 264 | getComponent<PonderableComponent>(entity); | 252 | getComponent<PonderableComponent>(entity); |
| @@ -266,26 +254,29 @@ CollisionResult PonderingSystem::moveBody( | |||
| 266 | auto& transformable = game_.getEntityManager(). | 254 | auto& transformable = game_.getEntityManager(). |
| 267 | getComponent<TransformableComponent>(entity); | 255 | getComponent<TransformableComponent>(entity); |
| 268 | 256 | ||
| 269 | const double oldX = transformable.x; | ||
| 270 | const double oldY = transformable.y; | ||
| 271 | const double oldRight = oldX + transformable.w; | ||
| 272 | const double oldBottom = oldY + transformable.h; | ||
| 273 | |||
| 274 | CollisionResult result; | 257 | CollisionResult result; |
| 275 | 258 | ||
| 276 | if (ponderable.collidable) | 259 | if (ponderable.collidable) |
| 277 | { | 260 | { |
| 278 | result = detectCollisions(entity, x, y); | 261 | result = detectCollisions(entity, newPos); |
| 279 | } else { | 262 | } else { |
| 280 | result.newX = x; | 263 | result.pos = newPos; |
| 281 | result.newY = y; | ||
| 282 | } | 264 | } |
| 283 | 265 | ||
| 284 | // Move | 266 | // Move |
| 285 | if (!ponderable.frozen) | 267 | if (!ponderable.frozen) |
| 286 | { | 268 | { |
| 287 | transformable.x = result.newX; | 269 | transformable.pos = result.pos; |
| 288 | transformable.y = result.newY; | 270 | |
| 271 | if (result.blockedHoriz) | ||
| 272 | { | ||
| 273 | ponderable.vel.x() = 0.0; | ||
| 274 | } | ||
| 275 | |||
| 276 | if (result.blockedVert) | ||
| 277 | { | ||
| 278 | ponderable.vel.y() = 0.0; | ||
| 279 | } | ||
| 289 | } | 280 | } |
| 290 | 281 | ||
| 291 | return result; | 282 | return result; |
| @@ -311,21 +302,14 @@ namespace CollisionParams { | |||
| 311 | return (colliderAxis > entityAxis); | 302 | return (colliderAxis > entityAxis); |
| 312 | } | 303 | } |
| 313 | 304 | ||
| 314 | inline static double OldAxis(const TransformableComponent& transformable) | 305 | inline static double EntityAxis(const vec2d& pos, const vec2i& size) |
| 315 | { | 306 | { |
| 316 | return HorizVert::AxisOldLower(transformable); | 307 | return HorizVert::AxisLower(pos); |
| 317 | } | 308 | } |
| 318 | 309 | ||
| 319 | inline static double NewAxis( | 310 | inline static double ObjectAxis(const vec2d& pos, const vec2i& size) |
| 320 | const CollisionResult& result, | ||
| 321 | const TransformableComponent&) | ||
| 322 | { | 311 | { |
| 323 | return HorizVert::AxisNewLower(result); | 312 | return HorizVert::AxisUpper(pos, size); |
| 324 | } | ||
| 325 | |||
| 326 | inline static double ObjectAxis(const TransformableComponent& transformable) | ||
| 327 | { | ||
| 328 | return HorizVert::AxisOldUpper(transformable); | ||
| 329 | } | 313 | } |
| 330 | 314 | ||
| 331 | inline static bool Closer(double left, double right) | 315 | inline static bool Closer(double left, double right) |
| @@ -352,21 +336,14 @@ namespace CollisionParams { | |||
| 352 | return (colliderAxis < entityAxis); | 336 | return (colliderAxis < entityAxis); |
| 353 | } | 337 | } |
| 354 | 338 | ||
| 355 | inline static double OldAxis(const TransformableComponent& transformable) | 339 | inline static double EntityAxis(const vec2d& pos, const vec2i& size) |
| 356 | { | 340 | { |
| 357 | return HorizVert::AxisOldUpper(transformable); | 341 | return HorizVert::AxisUpper(pos, size); |
| 358 | } | 342 | } |
| 359 | 343 | ||
| 360 | inline static double NewAxis( | 344 | inline static double ObjectAxis(const vec2d& pos, const vec2i& size) |
| 361 | const CollisionResult& result, | ||
| 362 | const TransformableComponent& transformable) | ||
| 363 | { | 345 | { |
| 364 | return HorizVert::AxisNewUpper(result, transformable); | 346 | return HorizVert::AxisLower(pos); |
| 365 | } | ||
| 366 | |||
| 367 | inline static double ObjectAxis(const TransformableComponent& transformable) | ||
| 368 | { | ||
| 369 | return HorizVert::AxisOldLower(transformable); | ||
| 370 | } | 347 | } |
| 371 | 348 | ||
| 372 | inline static bool Closer(double left, double right) | 349 | inline static bool Closer(double left, double right) |
| @@ -375,121 +352,62 @@ namespace CollisionParams { | |||
| 375 | } | 352 | } |
| 376 | }; | 353 | }; |
| 377 | 354 | ||
| 378 | class Horizontal { | 355 | template <size_t Axis, size_t NonAxis> |
| 356 | class HorizVert { | ||
| 379 | public: | 357 | public: |
| 380 | 358 | ||
| 381 | inline static double AxisOldLower( | 359 | inline static double AxisLower(const vec2d& pos) |
| 382 | const TransformableComponent& transformable) | ||
| 383 | { | 360 | { |
| 384 | return transformable.x; | 361 | return pos.coords[Axis]; |
| 385 | } | 362 | } |
| 386 | 363 | ||
| 387 | inline static double AxisOldUpper( | 364 | inline static double AxisUpper(const vec2d& pos, const vec2i& size) |
| 388 | const TransformableComponent& transformable) | ||
| 389 | { | 365 | { |
| 390 | return transformable.x + transformable.w; | 366 | return pos.coords[Axis] + size.coords[Axis]; |
| 391 | } | 367 | } |
| 392 | 368 | ||
| 393 | inline static double AxisNewLower(const CollisionResult& result) | 369 | inline static double NonAxisLower(const vec2d& pos) |
| 394 | { | 370 | { |
| 395 | return result.newX; | 371 | return pos.coords[NonAxis]; |
| 396 | } | 372 | } |
| 397 | 373 | ||
| 398 | inline static double AxisNewUpper( | 374 | inline static double NonAxisUpper(const vec2d& pos, const vec2i& size) |
| 399 | const CollisionResult& result, | ||
| 400 | const TransformableComponent& transformable) | ||
| 401 | { | 375 | { |
| 402 | return result.newX + transformable.w; | 376 | return pos.coords[NonAxis] + size.coords[NonAxis]; |
| 403 | } | 377 | } |
| 404 | 378 | ||
| 405 | inline static double NonAxisOldLower( | ||
| 406 | const TransformableComponent& transformable) | ||
| 407 | { | ||
| 408 | return transformable.y; | ||
| 409 | } | ||
| 410 | |||
| 411 | inline static double NonAxisOldUpper( | ||
| 412 | const TransformableComponent& transformable) | ||
| 413 | { | ||
| 414 | return transformable.y + transformable.h; | ||
| 415 | } | ||
| 416 | |||
| 417 | inline static double NonAxisNewLower( | ||
| 418 | const CollisionResult& result, | ||
| 419 | const TransformableComponent& transformable) | ||
| 420 | { | ||
| 421 | return result.newY; | ||
| 422 | } | ||
| 423 | |||
| 424 | inline static double NonAxisNewUpper( | ||
| 425 | const CollisionResult& result, | ||
| 426 | const TransformableComponent& transformable) | ||
| 427 | { | ||
| 428 | return result.newY + transformable.h; | ||
| 429 | } | ||
| 430 | }; | 379 | }; |
| 431 | 380 | ||
| 432 | class Vertical { | 381 | using Horizontal = HorizVert<0, 1>; |
| 433 | public: | 382 | using Vertical = HorizVert<1, 0>; |
| 434 | |||
| 435 | inline static double AxisOldLower( | ||
| 436 | const TransformableComponent& transformable) | ||
| 437 | { | ||
| 438 | return transformable.y; | ||
| 439 | } | ||
| 440 | |||
| 441 | inline static double AxisOldUpper( | ||
| 442 | const TransformableComponent& transformable) | ||
| 443 | { | ||
| 444 | return transformable.y + transformable.h; | ||
| 445 | } | ||
| 446 | 383 | ||
| 447 | inline static double AxisNewLower(const CollisionResult& result) | 384 | template <Direction dir, typename AscDesc> |
| 448 | { | 385 | class DetectCollisions : public AscDesc { |
| 449 | return result.newY; | 386 | public: |
| 450 | } | ||
| 451 | 387 | ||
| 452 | inline static double AxisNewUpper( | 388 | static const Direction Dir = dir; |
| 453 | const CollisionResult& result, | ||
| 454 | const TransformableComponent& transformable) | ||
| 455 | { | ||
| 456 | return result.newY + transformable.h; | ||
| 457 | } | ||
| 458 | 389 | ||
| 459 | inline static double NonAxisOldLower( | 390 | inline static double EntityAxis(const vec2d& pos, const vec2i& size) |
| 460 | const TransformableComponent& transformable) | ||
| 461 | { | 391 | { |
| 462 | return transformable.x; | 392 | return AscDesc::EntityAxis(pos, size); |
| 463 | } | 393 | } |
| 464 | 394 | ||
| 465 | inline static double NonAxisOldUpper( | 395 | inline static double ObjectAxis(const vec2d& pos, const vec2i& size) |
| 466 | const TransformableComponent& transformable) | ||
| 467 | { | 396 | { |
| 468 | return transformable.x + transformable.w; | 397 | return AscDesc::ObjectAxis(pos, size); |
| 469 | } | 398 | } |
| 470 | 399 | ||
| 471 | inline static double NonAxisNewLower( | 400 | inline static double EntityAxis(const TransformableComponent& transformable) |
| 472 | const CollisionResult& result, | ||
| 473 | const TransformableComponent& transformable) | ||
| 474 | { | 401 | { |
| 475 | return result.newX; | 402 | return AscDesc::EntityAxis(transformable.pos, transformable.size); |
| 476 | } | 403 | } |
| 477 | 404 | ||
| 478 | inline static double NonAxisNewUpper( | 405 | inline static double ObjectAxis(const TransformableComponent& transformable) |
| 479 | const CollisionResult& result, | ||
| 480 | const TransformableComponent& transformable) | ||
| 481 | { | 406 | { |
| 482 | return result.newX + transformable.w; | 407 | return AscDesc::ObjectAxis(transformable.pos, transformable.size); |
| 483 | } | 408 | } |
| 484 | }; | 409 | }; |
| 485 | 410 | ||
| 486 | template <Direction dir, typename AscDesc> | ||
| 487 | class DetectCollisions : public AscDesc { | ||
| 488 | public: | ||
| 489 | |||
| 490 | static const Direction Dir = dir; | ||
| 491 | }; | ||
| 492 | |||
| 493 | class Left : public DetectCollisions<Direction::left, Desc<Horizontal>> { | 411 | class Left : public DetectCollisions<Direction::left, Desc<Horizontal>> { |
| 494 | public: | 412 | public: |
| 495 | 413 | ||
| @@ -531,23 +449,22 @@ namespace CollisionParams { | |||
| 531 | }; | 449 | }; |
| 532 | }; | 450 | }; |
| 533 | 451 | ||
| 534 | CollisionResult PonderingSystem::detectCollisions( | 452 | PonderingSystem::CollisionResult PonderingSystem::detectCollisions( |
| 535 | id_type entity, | 453 | id_type entity, |
| 536 | double x, | 454 | vec2d newPos) |
| 537 | double y) | ||
| 538 | { | 455 | { |
| 539 | auto& transformable = game_.getEntityManager(). | 456 | auto& transformable = game_.getEntityManager(). |
| 540 | getComponent<TransformableComponent>(entity); | 457 | getComponent<TransformableComponent>(entity); |
| 541 | 458 | ||
| 542 | CollisionResult result; | 459 | CollisionResult result; |
| 543 | result.newX = x; | 460 | result.pos.x() = newPos.x(); |
| 544 | result.newY = transformable.y; | 461 | result.pos.y() = transformable.pos.y(); |
| 545 | 462 | ||
| 546 | // Find horizontal collisions. | 463 | // Find horizontal collisions. |
| 547 | if (result.newX < transformable.x) | 464 | if (result.pos.x() < transformable.pos.x()) |
| 548 | { | 465 | { |
| 549 | detectCollisionsInDirection<CollisionParams::Left>(entity, result); | 466 | detectCollisionsInDirection<CollisionParams::Left>(entity, result); |
| 550 | } else if (result.newX > transformable.x) | 467 | } else if (result.pos.x() > transformable.pos.x()) |
| 551 | { | 468 | { |
| 552 | detectCollisionsInDirection<CollisionParams::Right>(entity, result); | 469 | detectCollisionsInDirection<CollisionParams::Right>(entity, result); |
| 553 | } | 470 | } |
| @@ -555,13 +472,13 @@ CollisionResult PonderingSystem::detectCollisions( | |||
| 555 | // Find vertical collisions | 472 | // Find vertical collisions |
| 556 | if (!result.stopProcessing) | 473 | if (!result.stopProcessing) |
| 557 | { | 474 | { |
| 558 | result.newY = y; | 475 | result.pos.y() = newPos.y(); |
| 559 | result.touchedWall = false; | 476 | result.touchedWall = false; |
| 560 | 477 | ||
| 561 | if (result.newY < transformable.y) | 478 | if (result.pos.y() < transformable.pos.y()) |
| 562 | { | 479 | { |
| 563 | detectCollisionsInDirection<CollisionParams::Up>(entity, result); | 480 | detectCollisionsInDirection<CollisionParams::Up>(entity, result); |
| 564 | } else if (result.newY > transformable.y) | 481 | } else if (result.pos.y() > transformable.pos.y()) |
| 565 | { | 482 | { |
| 566 | detectCollisionsInDirection<CollisionParams::Down>(entity, result); | 483 | detectCollisionsInDirection<CollisionParams::Down>(entity, result); |
| 567 | } | 484 | } |
| @@ -586,25 +503,25 @@ void PonderingSystem::detectCollisionsInDirection( | |||
| 586 | getComponent<MappableComponent>(mapEntity); | 503 | getComponent<MappableComponent>(mapEntity); |
| 587 | 504 | ||
| 588 | // Get old location. | 505 | // Get old location. |
| 589 | auto& transformable = game_.getEntityManager(). | 506 | auto& transform = game_.getEntityManager(). |
| 590 | getComponent<TransformableComponent>(entity); | 507 | getComponent<TransformableComponent>(entity); |
| 591 | 508 | ||
| 592 | bool boundaryCollision = false; | 509 | bool boundaryCollision = false; |
| 593 | 510 | ||
| 594 | auto boundaries = Param::MapBoundaries(mappable); | 511 | auto boundaries = Param::MapBoundaries(mappable); |
| 595 | auto it = boundaries.lower_bound(Param::OldAxis(transformable)); | 512 | auto it = boundaries.lower_bound(Param::EntityAxis(transform)); |
| 596 | 513 | ||
| 597 | // Find the axis distance of the closest environmental boundary. | 514 | // Find the axis distance of the closest environmental boundary. |
| 598 | for (; | 515 | for (; |
| 599 | (it != std::end(boundaries)) && | 516 | (it != std::end(boundaries)) && |
| 600 | Param::AtLeastInAxisSweep( | 517 | Param::AtLeastInAxisSweep( |
| 601 | it->first, | 518 | it->first, |
| 602 | Param::NewAxis(result, transformable)); | 519 | Param::EntityAxis(result.pos, transform.size)); |
| 603 | it++) | 520 | it++) |
| 604 | { | 521 | { |
| 605 | // Check that the boundary is in range for the other axis. | 522 | // Check that the boundary is in range for the other axis. |
| 606 | if ((Param::NonAxisNewUpper(result, transformable) > it->second.lower) && | 523 | if ((Param::NonAxisUpper(result.pos, transform.size) > it->second.lower) && |
| 607 | (Param::NonAxisNewLower(result, transformable) < it->second.upper)) | 524 | (Param::NonAxisLower(result.pos) < it->second.upper)) |
| 608 | { | 525 | { |
| 609 | // We have a collision! | 526 | // We have a collision! |
| 610 | boundaryCollision = true; | 527 | boundaryCollision = true; |
| @@ -644,16 +561,16 @@ void PonderingSystem::detectCollisionsInDirection( | |||
| 644 | // Check if the entity would move into the potential collider, | 561 | // Check if the entity would move into the potential collider, |
| 645 | if (Param::IsPastAxis( | 562 | if (Param::IsPastAxis( |
| 646 | Param::ObjectAxis(colliderTrans), | 563 | Param::ObjectAxis(colliderTrans), |
| 647 | Param::NewAxis(result, transformable)) && | 564 | Param::EntityAxis(result.pos, transform.size)) && |
| 648 | // that it wasn't already colliding, | 565 | // that it wasn't already colliding, |
| 649 | !Param::IsPastAxis( | 566 | !Param::IsPastAxis( |
| 650 | Param::ObjectAxis(colliderTrans), | 567 | Param::ObjectAxis(colliderTrans), |
| 651 | Param::OldAxis(transformable)) && | 568 | Param::EntityAxis(transform)) && |
| 652 | // that the position on the non-axis is in range, | 569 | // that the position on the non-axis is in range, |
| 653 | (Param::NonAxisOldUpper(colliderTrans) > | 570 | (Param::NonAxisUpper(colliderTrans.pos, colliderTrans.size) > |
| 654 | Param::NonAxisNewLower(result, transformable)) && | 571 | Param::NonAxisLower(result.pos)) && |
| 655 | (Param::NonAxisOldLower(colliderTrans) < | 572 | (Param::NonAxisLower(colliderTrans.pos) < |
| 656 | Param::NonAxisNewUpper(result, transformable)) && | 573 | Param::NonAxisUpper(result.pos, transform.size)) && |
| 657 | // and that the collider is not farther away than the environmental | 574 | // and that the collider is not farther away than the environmental |
| 658 | // boundary. | 575 | // boundary. |
| 659 | (!boundaryCollision || | 576 | (!boundaryCollision || |
| @@ -688,7 +605,7 @@ void PonderingSystem::detectCollisionsInDirection( | |||
| 688 | // Check if the entity would still move into the potential collider. | 605 | // Check if the entity would still move into the potential collider. |
| 689 | if (!Param::IsPastAxis( | 606 | if (!Param::IsPastAxis( |
| 690 | Param::ObjectAxis(colliderTrans), | 607 | Param::ObjectAxis(colliderTrans), |
| 691 | Param::NewAxis(result, transformable))) | 608 | Param::EntityAxis(result.pos, transform.size))) |
| 692 | { | 609 | { |
| 693 | break; | 610 | break; |
| 694 | } | 611 | } |
| @@ -702,8 +619,8 @@ void PonderingSystem::detectCollisionsInDirection( | |||
| 702 | Param::Dir, | 619 | Param::Dir, |
| 703 | colliderPonder.colliderType, | 620 | colliderPonder.colliderType, |
| 704 | Param::ObjectAxis(colliderTrans), | 621 | Param::ObjectAxis(colliderTrans), |
| 705 | Param::NonAxisOldLower(colliderTrans), | 622 | Param::NonAxisLower(colliderTrans.pos), |
| 706 | Param::NonAxisOldUpper(colliderTrans), | 623 | Param::NonAxisUpper(colliderTrans.pos, colliderTrans.size), |
| 707 | result); | 624 | result); |
| 708 | 625 | ||
| 709 | if (result.stopProcessing) | 626 | if (result.stopProcessing) |
| @@ -724,8 +641,8 @@ void PonderingSystem::detectCollisionsInDirection( | |||
| 724 | (it->first == boundaryAxis); | 641 | (it->first == boundaryAxis); |
| 725 | it++) | 642 | it++) |
| 726 | { | 643 | { |
| 727 | if ((Param::NonAxisNewUpper(result, transformable) > it->second.lower) && | 644 | if ((Param::NonAxisLower(result.pos) < it->second.upper) && |
| 728 | (Param::NonAxisNewLower(result, transformable) < it->second.upper)) | 645 | (Param::NonAxisUpper(result.pos, transform.size) > it->second.lower)) |
| 729 | { | 646 | { |
| 730 | processCollision( | 647 | processCollision( |
| 731 | entity, | 648 | entity, |
| @@ -756,9 +673,6 @@ void PonderingSystem::processCollision( | |||
| 756 | double upper, | 673 | double upper, |
| 757 | CollisionResult& result) | 674 | CollisionResult& result) |
| 758 | { | 675 | { |
| 759 | auto& ponderable = game_.getEntityManager(). | ||
| 760 | getComponent<PonderableComponent>(entity); | ||
| 761 | |||
| 762 | auto& transformable = game_.getEntityManager(). | 676 | auto& transformable = game_.getEntityManager(). |
| 763 | getComponent<TransformableComponent>(entity); | 677 | getComponent<TransformableComponent>(entity); |
| 764 | 678 | ||
| @@ -823,29 +737,29 @@ void PonderingSystem::processCollision( | |||
| 823 | { | 737 | { |
| 824 | case Direction::left: | 738 | case Direction::left: |
| 825 | { | 739 | { |
| 826 | result.newX = GAME_WIDTH + WALL_GAP - transformable.w; | 740 | result.pos.x() = GAME_WIDTH + WALL_GAP - transformable.size.w(); |
| 827 | 741 | ||
| 828 | break; | 742 | break; |
| 829 | } | 743 | } |
| 830 | 744 | ||
| 831 | case Direction::right: | 745 | case Direction::right: |
| 832 | { | 746 | { |
| 833 | result.newX = -WALL_GAP; | 747 | result.pos.x() = -WALL_GAP; |
| 834 | 748 | ||
| 835 | break; | 749 | break; |
| 836 | } | 750 | } |
| 837 | 751 | ||
| 838 | case Direction::up: | 752 | case Direction::up: |
| 839 | { | 753 | { |
| 840 | result.newY = | 754 | result.pos.y() = |
| 841 | MAP_HEIGHT * TILE_HEIGHT + WALL_GAP - transformable.h; | 755 | MAP_HEIGHT * TILE_HEIGHT + WALL_GAP - transformable.pos.h(); |
| 842 | 756 | ||
| 843 | break; | 757 | break; |
| 844 | } | 758 | } |
| 845 | 759 | ||
| 846 | case Direction::down: | 760 | case Direction::down: |
| 847 | { | 761 | { |
| 848 | result.newY = -WALL_GAP; | 762 | result.pos.y() = -WALL_GAP; |
| 849 | 763 | ||
| 850 | break; | 764 | break; |
| 851 | } | 765 | } |
| @@ -905,33 +819,33 @@ void PonderingSystem::processCollision( | |||
| 905 | { | 819 | { |
| 906 | case Direction::left: | 820 | case Direction::left: |
| 907 | { | 821 | { |
| 908 | result.newX = axis; | 822 | result.pos.x() = axis; |
| 909 | ponderable.velX = 0.0; | 823 | result.blockedHoriz = true; |
| 910 | 824 | ||
| 911 | break; | 825 | break; |
| 912 | } | 826 | } |
| 913 | 827 | ||
| 914 | case Direction::right: | 828 | case Direction::right: |
| 915 | { | 829 | { |
| 916 | result.newX = axis - transformable.w; | 830 | result.pos.x() = axis - transformable.size.w(); |
| 917 | ponderable.velX = 0.0; | 831 | result.blockedHoriz = true; |
| 918 | 832 | ||
| 919 | break; | 833 | break; |
| 920 | } | 834 | } |
| 921 | 835 | ||
| 922 | case Direction::up: | 836 | case Direction::up: |
| 923 | { | 837 | { |
| 924 | result.newY = axis; | 838 | result.pos.y() = axis; |
| 925 | ponderable.velY = 0.0; | 839 | result.blockedVert = true; |
| 926 | 840 | ||
| 927 | break; | 841 | break; |
| 928 | } | 842 | } |
| 929 | 843 | ||
| 930 | case Direction::down: | 844 | case Direction::down: |
| 931 | { | 845 | { |
| 932 | result.newY = axis - transformable.h; | 846 | result.pos.y() = axis - transformable.size.h(); |
| 847 | result.blockedVert = true; | ||
| 933 | result.groundEntity = collider; | 848 | result.groundEntity = collider; |
| 934 | ponderable.velY = 0.0; | ||
| 935 | result.grounded = true; | 849 | result.grounded = true; |
| 936 | 850 | ||
| 937 | break; | 851 | break; |
| diff --git a/src/systems/pondering.h b/src/systems/pondering.h index abc6db2..273db67 100644 --- a/src/systems/pondering.h +++ b/src/systems/pondering.h | |||
| @@ -4,19 +4,7 @@ | |||
| 4 | #include "system.h" | 4 | #include "system.h" |
| 5 | #include "components/ponderable.h" | 5 | #include "components/ponderable.h" |
| 6 | #include "direction.h" | 6 | #include "direction.h" |
| 7 | 7 | #include "vector.h" | |
| 8 | struct CollisionResult | ||
| 9 | { | ||
| 10 | double newX; | ||
| 11 | double newY; | ||
| 12 | bool stopProcessing = false; | ||
| 13 | bool touchedWall = false; | ||
| 14 | bool adjacentlyWarping = false; | ||
| 15 | Direction adjWarpDir; | ||
| 16 | size_t adjWarpMapId; | ||
| 17 | bool grounded = false; | ||
| 18 | EntityManager::id_type groundEntity; | ||
| 19 | }; | ||
| 20 | 8 | ||
| 21 | class PonderingSystem : public System { | 9 | class PonderingSystem : public System { |
| 22 | public: | 10 | public: |
| @@ -47,7 +35,19 @@ public: | |||
| 47 | 35 | ||
| 48 | private: | 36 | private: |
| 49 | 37 | ||
| 50 | 38 | struct CollisionResult | |
| 39 | { | ||
| 40 | vec2d pos; | ||
| 41 | bool stopProcessing = false; | ||
| 42 | bool touchedWall = false; | ||
| 43 | bool blockedHoriz = false; | ||
| 44 | bool blockedVert = false; | ||
| 45 | bool adjacentlyWarping = false; | ||
| 46 | Direction adjWarpDir; | ||
| 47 | size_t adjWarpMapId; | ||
| 48 | bool grounded = false; | ||
| 49 | id_type groundEntity; | ||
| 50 | }; | ||
| 51 | 51 | ||
| 52 | void tickBody( | 52 | void tickBody( |
| 53 | id_type entity, | 53 | id_type entity, |
| @@ -56,13 +56,11 @@ private: | |||
| 56 | 56 | ||
| 57 | CollisionResult moveBody( | 57 | CollisionResult moveBody( |
| 58 | id_type entity, | 58 | id_type entity, |
| 59 | double x, | 59 | vec2d newPos); |
| 60 | double y); | ||
| 61 | 60 | ||
| 62 | CollisionResult detectCollisions( | 61 | CollisionResult detectCollisions( |
| 63 | id_type entity, | 62 | id_type entity, |
| 64 | double x, | 63 | vec2d newPos); |
| 65 | double y); | ||
| 66 | 64 | ||
| 67 | template <typename Param> | 65 | template <typename Param> |
| 68 | void detectCollisionsInDirection( | 66 | void detectCollisionsInDirection( |
| diff --git a/src/systems/realizing.cpp b/src/systems/realizing.cpp index 8e670ac..f9285ad 100644 --- a/src/systems/realizing.cpp +++ b/src/systems/realizing.cpp | |||
| @@ -93,20 +93,20 @@ void parseAI( | |||
| 93 | 93 | ||
| 94 | if (direction == "left") | 94 | if (direction == "left") |
| 95 | { | 95 | { |
| 96 | action.speedX = -speed; | 96 | action.speed.x() = -speed; |
| 97 | action.speedY = 0; | 97 | action.speed.y() = 0; |
| 98 | } else if (direction == "right") | 98 | } else if (direction == "right") |
| 99 | { | 99 | { |
| 100 | action.speedX = speed; | 100 | action.speed.x() = speed; |
| 101 | action.speedY = 0; | 101 | action.speed.y() = 0; |
| 102 | } else if (direction == "up") | 102 | } else if (direction == "up") |
| 103 | { | 103 | { |
| 104 | action.speedX = 0; | 104 | action.speed.x() = 0; |
| 105 | action.speedY = -speed; | 105 | action.speed.y() = -speed; |
| 106 | } else if (direction == "down") | 106 | } else if (direction == "down") |
| 107 | { | 107 | { |
| 108 | action.speedX = 0; | 108 | action.speed.x() = 0; |
| 109 | action.speedY = speed; | 109 | action.speed.y() = speed; |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | action.dur = length / speed; | 112 | action.dur = length / speed; |
| @@ -186,11 +186,11 @@ EntityManager::id_type RealizingSystem::initSingleton( | |||
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | key = getProp(top, "startx"); | 188 | key = getProp(top, "startx"); |
| 189 | realizable.startingX = atoi(reinterpret_cast<char*>(key)); | 189 | realizable.startingPos.x() = atoi(reinterpret_cast<char*>(key)); |
| 190 | xmlFree(key); | 190 | xmlFree(key); |
| 191 | 191 | ||
| 192 | key = getProp(top, "starty"); | 192 | key = getProp(top, "starty"); |
| 193 | realizable.startingY = atoi(reinterpret_cast<char*>(key)); | 193 | realizable.startingPos.y() = atoi(reinterpret_cast<char*>(key)); |
| 194 | xmlFree(key); | 194 | xmlFree(key); |
| 195 | 195 | ||
| 196 | key = getProp(top, "startmap"); | 196 | key = getProp(top, "startmap"); |
| @@ -260,11 +260,11 @@ EntityManager::id_type RealizingSystem::initSingleton( | |||
| 260 | emplaceComponent<TransformableComponent>(mapObject); | 260 | emplaceComponent<TransformableComponent>(mapObject); |
| 261 | 261 | ||
| 262 | key = getProp(mapNode, "x"); | 262 | key = getProp(mapNode, "x"); |
| 263 | transformable.origX = atoi(reinterpret_cast<char*>(key)); | 263 | transformable.origPos.x() = atoi(reinterpret_cast<char*>(key)); |
| 264 | xmlFree(key); | 264 | xmlFree(key); |
| 265 | 265 | ||
| 266 | key = getProp(mapNode, "y"); | 266 | key = getProp(mapNode, "y"); |
| 267 | transformable.origY = atoi(reinterpret_cast<char*>(key)); | 267 | transformable.origPos.y() = atoi(reinterpret_cast<char*>(key)); |
| 268 | xmlFree(key); | 268 | xmlFree(key); |
| 269 | 269 | ||
| 270 | // Set the sprite and size using the prototype definition. | 270 | // Set the sprite and size using the prototype definition. |
| @@ -273,17 +273,17 @@ EntityManager::id_type RealizingSystem::initSingleton( | |||
| 273 | xmlFree(key); | 273 | xmlFree(key); |
| 274 | 274 | ||
| 275 | key = getProp(prototypeNode, "width"); | 275 | key = getProp(prototypeNode, "width"); |
| 276 | transformable.origW = atoi(reinterpret_cast<char*>(key)); | 276 | transformable.origSize.w() = atoi(reinterpret_cast<char*>(key)); |
| 277 | xmlFree(key); | 277 | xmlFree(key); |
| 278 | 278 | ||
| 279 | key = getProp(prototypeNode, "height"); | 279 | key = getProp(prototypeNode, "height"); |
| 280 | transformable.origH = atoi(reinterpret_cast<char*>(key)); | 280 | transformable.origSize.h() = atoi(reinterpret_cast<char*>(key)); |
| 281 | xmlFree(key); | 281 | xmlFree(key); |
| 282 | 282 | ||
| 283 | AnimationSet objectAnim( | 283 | AnimationSet objectAnim( |
| 284 | spritePath.c_str(), | 284 | spritePath.c_str(), |
| 285 | transformable.origW, | 285 | transformable.origSize.w(), |
| 286 | transformable.origH, | 286 | transformable.origSize.h(), |
| 287 | 1); | 287 | 1); |
| 288 | 288 | ||
| 289 | objectAnim.emplaceAnimation("static", 0, 1, 1); | 289 | objectAnim.emplaceAnimation("static", 0, 1, 1); |
| @@ -503,10 +503,8 @@ void RealizingSystem::loadMap(id_type mapEntity) | |||
| 503 | auto& transformable = game_.getEntityManager(). | 503 | auto& transformable = game_.getEntityManager(). |
| 504 | getComponent<TransformableComponent>(prototype); | 504 | getComponent<TransformableComponent>(prototype); |
| 505 | 505 | ||
| 506 | transformable.x = transformable.origX; | 506 | transformable.pos = transformable.origPos; |
| 507 | transformable.y = transformable.origY; | 507 | transformable.size = transformable.origSize; |
| 508 | transformable.w = transformable.origW; | ||
| 509 | transformable.h = transformable.origH; | ||
| 510 | } | 508 | } |
| 511 | 509 | ||
| 512 | if (game_.getEntityManager().hasComponent<AnimatableComponent>(prototype)) | 510 | if (game_.getEntityManager().hasComponent<AnimatableComponent>(prototype)) |
| diff --git a/src/vector.h b/src/vector.h new file mode 100644 index 0000000..3abd98a --- /dev/null +++ b/src/vector.h | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | #ifndef COORDINATES_H_A45D34FB | ||
| 2 | #define COORDINATES_H_A45D34FB | ||
| 3 | |||
| 4 | template <typename T> | ||
| 5 | class vec2 { | ||
| 6 | public: | ||
| 7 | |||
| 8 | T coords[2]; | ||
| 9 | |||
| 10 | vec2() = default; | ||
| 11 | |||
| 12 | vec2(double x, double y) : coords{x, y} | ||
| 13 | { | ||
| 14 | } | ||
| 15 | |||
| 16 | inline T& x() | ||
| 17 | { | ||
| 18 | return coords[0]; | ||
| 19 | } | ||
| 20 | |||
| 21 | inline const T& x() const | ||
| 22 | { | ||
| 23 | return coords[0]; | ||
| 24 | } | ||
| 25 | |||
| 26 | inline T& w() | ||
| 27 | { | ||
| 28 | return coords[0]; | ||
| 29 | } | ||
| 30 | |||
| 31 | inline const T& w() const | ||
| 32 | { | ||
| 33 | return coords[0]; | ||
| 34 | } | ||
| 35 | |||
| 36 | inline T& y() | ||
| 37 | { | ||
| 38 | return coords[1]; | ||
| 39 | } | ||
| 40 | |||
| 41 | inline const T& y() const | ||
| 42 | { | ||
| 43 | return coords[1]; | ||
| 44 | } | ||
| 45 | |||
| 46 | inline T& h() | ||
| 47 | { | ||
| 48 | return coords[1]; | ||
| 49 | } | ||
| 50 | |||
| 51 | inline const T& h() const | ||
| 52 | { | ||
| 53 | return coords[1]; | ||
| 54 | } | ||
| 55 | |||
| 56 | template <typename R> | ||
| 57 | operator vec2<R>() const | ||
| 58 | { | ||
| 59 | return vec2<R>(x(), y()); | ||
| 60 | } | ||
| 61 | |||
| 62 | vec2 operator+(const vec2& other) const | ||
| 63 | { | ||
| 64 | return vec2(x() + other.x(), y() + other.y()); | ||
| 65 | } | ||
| 66 | |||
| 67 | vec2& operator+=(const vec2& other) | ||
| 68 | { | ||
| 69 | x() += other.x(); | ||
| 70 | y() += other.y(); | ||
| 71 | |||
| 72 | return *this; | ||
| 73 | } | ||
| 74 | |||
| 75 | vec2 operator-(const vec2& other) const | ||
| 76 | { | ||
| 77 | return vec2(x() - other.x(), y() - other.y()); | ||
| 78 | } | ||
| 79 | |||
| 80 | vec2 operator-=(const vec2& other) | ||
| 81 | { | ||
| 82 | x() -= other.x(); | ||
| 83 | y() -= other.y(); | ||
| 84 | |||
| 85 | return *this; | ||
| 86 | } | ||
| 87 | |||
| 88 | vec2 operator-() const | ||
| 89 | { | ||
| 90 | return vec2(-x(), -y()); | ||
| 91 | } | ||
| 92 | |||
| 93 | vec2 operator*(double s) const | ||
| 94 | { | ||
| 95 | return vec2(x() * s, y() * s); | ||
| 96 | } | ||
| 97 | |||
| 98 | vec2& operator*=(double s) | ||
| 99 | { | ||
| 100 | x() *= s; | ||
| 101 | y() *= s; | ||
| 102 | |||
| 103 | return *this; | ||
| 104 | } | ||
| 105 | |||
| 106 | }; | ||
| 107 | |||
| 108 | using vec2d = vec2<double>; | ||
| 109 | using vec2i = vec2<int>; | ||
| 110 | |||
| 111 | #endif /* end of include guard: COORDINATES_H_A45D34FB */ | ||
