From 106c2cf409b358a7ce2a22bf3d1a4406f2fbd070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pale=C4=8Dek?= Date: Sat, 5 Aug 2023 12:42:38 +0200 Subject: [PATCH] replace direction bools with Direction for bumpers and pushbuttons code quality --- .../objects/pushbutton/pushbutton.sprite | 23 ++++++-- data/images/objects/trampoline/bumper.sprite | 12 ++-- src/object/bumper.cpp | 39 ++++++++---- src/object/bumper.hpp | 6 +- src/object/pushbutton.cpp | 59 ++++++++++++------- src/object/pushbutton.hpp | 11 +++- 6 files changed, 102 insertions(+), 48 deletions(-) diff --git a/data/images/objects/pushbutton/pushbutton.sprite b/data/images/objects/pushbutton/pushbutton.sprite index 3d8a98ef0cc..22ab5c23d6d 100644 --- a/data/images/objects/pushbutton/pushbutton.sprite +++ b/data/images/objects/pushbutton/pushbutton.sprite @@ -1,16 +1,27 @@ (supertux-sprite (action - (name "off") + (name "off-up") (hitbox 0 0 30 16) (images "pushbutton-0.png") ) (action - (name "on") + (name "on-up") (hitbox 0 0 30 10) - (loops 1) - (fps 20) + (loops 1) + (fps 20) (images "pushbutton-1.png" - "pushbutton-2.png" - "pushbutton-3.png") + "pushbutton-2.png" + "pushbutton-3.png" + ) + ) + (action + (name "off-down") + (hitbox 0 0 30 16) + (flip-action "off-up") + ) + (action + (name "on-down") + (hitbox 0 0 30 10) + (flip-action "on-up") ) ) diff --git a/data/images/objects/trampoline/bumper.sprite b/data/images/objects/trampoline/bumper.sprite index d19eb96a14b..6f42d0e6f48 100644 --- a/data/images/objects/trampoline/bumper.sprite +++ b/data/images/objects/trampoline/bumper.sprite @@ -1,11 +1,11 @@ (supertux-sprite (action - (name "right-normal") + (name "normal-right") (hitbox 0 2 18 27) (images "right-0.png") ) (action - (name "right-swinging") + (name "swinging-right") (fps 24) (hitbox 0 2 18 27) (images "right-0.png" @@ -17,14 +17,14 @@ ) ) (action - (name "left-normal") + (name "normal-left") (hitbox 14 2 18 27) - (mirror-action "right-normal") + (mirror-action "normal-right") ) (action - (name "left-swinging") + (name "swinging-left") (fps 24) (hitbox 14 2 18 27) - (mirror-action "right-swinging") + (mirror-action "swinging-right") ) ) diff --git a/src/object/bumper.cpp b/src/object/bumper.cpp index 0fd0caa3fd2..ba65455189a 100644 --- a/src/object/bumper.cpp +++ b/src/object/bumper.cpp @@ -32,11 +32,28 @@ const float BOUNCE_X = 700.0f; Bumper::Bumper(const ReaderMapping& reader) : MovingSprite(reader, "images/objects/trampoline/bumper.sprite", LAYER_OBJECTS, COLGROUP_MOVING), m_physic(), - m_facing_left() + m_dir(Direction::RIGHT), + m_dir_in_allowed(0), + m_allowed_directions({Direction::LEFT, Direction::RIGHT}) { - reader.get("left", m_facing_left); - set_action(m_facing_left ? "left-normal" : "right-normal"); + std::string dir_str; + bool old_facing_left = false; + + if (reader.get("direction", dir_str)) + m_dir = string_to_dir(dir_str); + else if (reader.get("left", old_facing_left) && old_facing_left) + m_dir = Direction::LEFT; + set_action("normal", m_dir); m_physic.enable_gravity(false); + + for (int i = 0; i < static_cast(m_allowed_directions.size()); ++i) + { + if (m_allowed_directions[i] == m_dir) + { + m_dir_in_allowed = i; + break; + } + } } ObjectSettings @@ -44,8 +61,8 @@ Bumper::get_settings() { ObjectSettings result = MovingSprite::get_settings(); - result.add_bool(_("Facing Left"), &m_facing_left, "left", false); - result.reorder({"left", "sprite", "x", "y"}); + result.add_direction(_("Direction"), reinterpret_cast(&m_dir_in_allowed), Direction::RIGHT, "direction", 0, m_allowed_directions); + result.reorder({"direction", "sprite", "x", "y"}); return result; } @@ -53,9 +70,7 @@ void Bumper::update(float dt_sec) { if (m_sprite->animation_done()) - { - set_action(m_facing_left ? "left-normal" : "right-normal"); - } + set_action("normal", m_dir); m_col.set_movement(m_physic.get_movement (dt_sec)); } @@ -65,11 +80,11 @@ Bumper::collision(GameObject& other, const CollisionHit& hit) auto player = dynamic_cast (&other); if (player) { - float BOUNCE_DIR = m_facing_left ? -BOUNCE_X : BOUNCE_X; + float BOUNCE_DIR = m_dir == Direction::LEFT ? -BOUNCE_X : BOUNCE_X; player->get_physic().set_velocity(0.f, player->is_swimming() ? 0.f : BOUNCE_Y); player->sideways_push(BOUNCE_DIR); SoundManager::current()->play(TRAMPOLINE_SOUND, get_pos()); - set_action((m_facing_left ? "left-swinging" : "right-swinging"), 1); + set_action("swinging", m_dir, 1); } auto bumper = dynamic_cast (&other); if (bumper) @@ -90,7 +105,9 @@ void Bumper::after_editor_set() { MovingSprite::after_editor_set(); - set_action(m_facing_left ? "left-normal" : "right-normal"); + + m_dir = m_allowed_directions[m_dir_in_allowed]; + set_action("normal", m_dir); } void diff --git a/src/object/bumper.hpp b/src/object/bumper.hpp index 65258cffac7..42038540223 100644 --- a/src/object/bumper.hpp +++ b/src/object/bumper.hpp @@ -20,6 +20,7 @@ #include "supertux/physic.hpp" +enum class Direction; class Player; class Bumper final : public MovingSprite @@ -44,7 +45,10 @@ class Bumper final : public MovingSprite private: Physic m_physic; - bool m_facing_left; + + Direction m_dir; + int m_dir_in_allowed; + std::vector m_allowed_directions; private: Bumper(const Bumper&) = delete; diff --git a/src/object/pushbutton.cpp b/src/object/pushbutton.cpp index c4c49325dbf..4e13f579ab9 100644 --- a/src/object/pushbutton.cpp +++ b/src/object/pushbutton.cpp @@ -20,6 +20,7 @@ #include "object/player.hpp" #include "object/rock.hpp" #include "sprite/sprite.hpp" +#include "supertux/direction.hpp" #include "supertux/flip_level_transformer.hpp" #include "supertux/sector.hpp" #include "util/reader_mapping.hpp" @@ -31,21 +32,37 @@ const std::string BUTTON_SOUND = "sounds/switch.ogg"; PushButton::PushButton(const ReaderMapping& mapping) : MovingSprite(mapping, "images/objects/pushbutton/pushbutton.sprite", LAYER_BACKGROUNDTILES+1, COLGROUP_MOVING), - script(), - state(OFF), - m_upside_down(false) + m_script(), + m_state(OFF), + m_dir(Direction::UP), + m_dir_in_allowed(0), + m_allowed_directions({Direction::UP, Direction::DOWN}) { SoundManager::current()->preload(BUTTON_SOUND); - set_action("off", -1); - if (!mapping.get("script", script)) + if (!mapping.get("script", m_script)) { log_warning << "No script set for pushbutton." << std::endl; } - mapping.get("upside-down", m_upside_down); - if (m_upside_down) - FlipLevelTransformer::transform_flip(m_flip); + bool old_upside_down; + std::string dir_str; + + if (mapping.get("direction", dir_str)) + m_dir = string_to_dir(dir_str); + else if (mapping.get("upside-down", old_upside_down) && old_upside_down) + m_dir = Direction::DOWN; + + for (int i = 0; i < static_cast(m_allowed_directions.size()); ++i) + { + if (m_allowed_directions[i] == m_dir) + { + m_dir_in_allowed = i; + break; + } + } + + set_action("off", m_dir, -1); } ObjectSettings @@ -53,10 +70,10 @@ PushButton::get_settings() { ObjectSettings result = MovingSprite::get_settings(); - result.add_script(_("Script"), &script, "script"); - result.add_bool(_("Upside down"), &m_upside_down, "upside-down"); + result.add_direction(_("Direction"), reinterpret_cast(&m_dir_in_allowed), Direction::UP, "direction", 0, m_allowed_directions); + result.add_script(_("Script"), &m_script, "script"); - result.reorder({"script", "upside-down", "x", "y"}); + result.reorder({"direction", "script", "x", "y"}); return result; } @@ -65,8 +82,8 @@ void PushButton::after_editor_set() { MovingSprite::after_editor_set(); - if ((m_upside_down && m_flip == NO_FLIP) || (!m_upside_down && m_flip == VERTICAL_FLIP)) - FlipLevelTransformer::transform_flip(m_flip); + m_dir = m_allowed_directions[m_dir_in_allowed]; + set_action("off", m_dir); } void @@ -85,7 +102,7 @@ PushButton::collision(GameObject& other, const CollisionHit& hit) { float vy = player->get_physic().get_velocity_y(); - if (m_upside_down) + if (m_dir == Direction::DOWN) { if (vy >= 0) return FORCE_MOVE; @@ -106,22 +123,22 @@ PushButton::collision(GameObject& other, const CollisionHit& hit) } } - if (state != OFF || !(m_upside_down ? hit.bottom : hit.top)) + if (m_state != OFF || !(m_dir == Direction::DOWN ? hit.bottom : hit.top)) return FORCE_MOVE; // change appearance - state = ON; + m_state = ON; float old_bbox_height = m_col.m_bbox.get_height(); - set_action("on", -1); + set_action("on", m_dir, -1); float new_bbox_height = m_col.m_bbox.get_height(); Vector delta(0, old_bbox_height - new_bbox_height); - set_pos(get_pos() + delta * (m_upside_down ? 0 : 1.f)); + set_pos(get_pos() + delta * (m_dir == Direction::DOWN ? 0 : 1.f)); // play sound SoundManager::current()->play(BUTTON_SOUND, get_pos()); // run script - Sector::get().run_script(script, "PushButton"); + Sector::get().run_script(m_script, "PushButton"); return FORCE_MOVE; } @@ -130,8 +147,8 @@ void PushButton::on_flip(float height) { MovingSprite::on_flip(height); - FlipLevelTransformer::transform_flip(m_flip); - m_upside_down = !m_upside_down; + m_dir = m_dir == Direction::UP ? Direction::DOWN : Direction::UP; + set_action(m_state == OFF ? "off" : "on", m_dir); } /* EOF */ diff --git a/src/object/pushbutton.hpp b/src/object/pushbutton.hpp index 5e29aa0902e..dacd2da24c6 100644 --- a/src/object/pushbutton.hpp +++ b/src/object/pushbutton.hpp @@ -19,6 +19,8 @@ #include "object/moving_sprite.hpp" +enum class Direction; + /** PushButton - jump on it to run a script */ class PushButton final : public MovingSprite { @@ -43,9 +45,12 @@ class PushButton final : public MovingSprite ON }; - std::string script; - PushButtonState state; - bool m_upside_down; + std::string m_script; + PushButtonState m_state; + + Direction m_dir; + int m_dir_in_allowed; + std::vector m_allowed_directions; private: PushButton(const PushButton&) = delete;