diff --git a/src/entity/hud.cpp b/src/entity/hud.cpp index f409bf1..803339f 100644 --- a/src/entity/hud.cpp +++ b/src/entity/hud.cpp @@ -118,3 +118,13 @@ auto entity::hud::is_dead() const -> bool { return state.get_dead(); } + +auto entity::hud::get_player_speed_modifier() const -> float +{ + return player_speed_modifier; +} + +void entity::hud::set_player_speed_modifier(float value) +{ + player_speed_modifier = value; +} diff --git a/src/entity/hud.hpp b/src/entity/hud.hpp index e41aa1d..54f4ea3 100644 --- a/src/entity/hud.hpp +++ b/src/entity/hud.hpp @@ -34,6 +34,9 @@ namespace entity /** Player is dead */ auto is_dead() const -> bool; + auto get_player_speed_modifier() const -> float; + void set_player_speed_modifier(float value); + private: /** Font size for all HUD elements */ static constexpr int font_size = 30; @@ -61,6 +64,8 @@ namespace entity asset::sound snd_gem; asset::sound snd_fall; + float player_speed_modifier = 1.F; + void update(ce::level &level); }; } diff --git a/src/entity/player.cpp b/src/entity/player.cpp index 641a2d7..fef9c5e 100644 --- a/src/entity/player.cpp +++ b/src/entity/player.cpp @@ -15,13 +15,15 @@ void entity::player::update(const ce::input &input, { if (!is_paused) { + auto speed_limit_x = speed_limit * hud.get_player_speed_modifier(); + // Right if (input.is_down(ce::key::right)) { velocity.x += move_acceleration; - if (velocity.x > speed_limit) + if (velocity.x > speed_limit_x) { - velocity.x = speed_limit; + velocity.x = speed_limit_x; } } else if (velocity.x > 0 && is_grounded()) @@ -37,9 +39,9 @@ void entity::player::update(const ce::input &input, if (input.is_down(ce::key::left)) { velocity.x -= move_acceleration; - if (velocity.x < -speed_limit) + if (velocity.x < -speed_limit_x) { - velocity.x = -speed_limit; + velocity.x = -speed_limit_x; } } else if (velocity.x < 0 && is_grounded()) diff --git a/src/physics/collision.cpp b/src/physics/collision.cpp index 7eaa9d3..d88713f 100644 --- a/src/physics/collision.cpp +++ b/src/physics/collision.cpp @@ -25,6 +25,9 @@ auto phys::collision::update(const Rectangle &player_rect, ce::vector2f player_position(rect.x, rect.y); auto player_tile = (player_position / ce::tile_size).to(); + // Reset speed modifier + hud.set_player_speed_modifier(1.F); + auto rect_x = rect; rect_x.x += velocity.x; if (will_collide(level, hud, player_tile, rect_x, velocity)) @@ -145,7 +148,7 @@ auto phys::collision::collect_item(ce::level &level, } else if (item == tile::water) { - // TODO: Slow down player + hud.set_player_speed_modifier(0.5F); } else if (item == tile::lava || item == tile::spike)