Skip to content

Commit

Permalink
Fix sprite hardcoding issues, convert more objects to MovingSprite
Browse files Browse the repository at this point in the history
Some objects contain duplicate code for setting their sprite, which in some cases overrides the custom sprite preference. Such duplicate code has been removed.

Some objects inherit `MovingObject`, whilst managing a sprite. Many of such objects have been converted to MovingObject.
Triggers haven't been converted yet. That is to come with a future PR.

Additionally, `m_sprite->set_action` calls on `MovingSprite` objects have been replaced with `set_action` calls. This makes sure that when the action is updated, the object's hitbox is too.
  • Loading branch information
Vankata453 committed Jul 24, 2023
1 parent 81172c3 commit 771e4e2
Show file tree
Hide file tree
Showing 38 changed files with 143 additions and 294 deletions.
3 changes: 0 additions & 3 deletions src/badguy/flame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ Flame::Flame(const ReaderMapping& reader, const std::string& sprite) :
m_countMe = false;
SoundManager::current()->preload(FLAME_SOUND);

reader.get("sprite", m_sprite_name, m_sprite_name.c_str());
m_sprite = SpriteManager::current()->create(m_sprite_name);

set_colgroup_active(COLGROUP_TOUCHABLE);

m_lightsprite->set_color(Color(0.21f, 0.13f, 0.08f));
Expand Down
10 changes: 0 additions & 10 deletions src/badguy/goldbomb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,6 @@ GoldBomb::GoldBomb(const ReaderMapping& reader) :
//Prevent stutter when Tux jumps on Gold Bomb
SoundManager::current()->preload("sounds/explosion.wav");

//Check if we need another sprite
if ( !reader.get( "sprite", m_sprite_name ) ){
return;
}
if (m_sprite_name.empty()) {
m_sprite_name = "images/creatures/gold_bomb/gold_bomb.sprite";
return;
}
//Replace sprite
m_sprite = SpriteManager::current()->create( m_sprite_name );
m_exploding_sprite->set_action("default", 1);
}

Expand Down
11 changes: 0 additions & 11 deletions src/badguy/haywire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,17 +56,6 @@ Haywire::Haywire(const ReaderMapping& reader) :

//Prevent stutter when Tux jumps on Mr Bomb
SoundManager::current()->preload("sounds/explosion.wav");

//Check if we need another sprite
if ( !reader.get( "sprite", m_sprite_name ) ){
return;
}
if (m_sprite_name.empty()) {
m_sprite_name = "images/creatures/haywire/haywire.sprite";
return;
}
//Replace sprite
m_sprite = SpriteManager::current()->create( m_sprite_name );
}

Direction
Expand Down
10 changes: 3 additions & 7 deletions src/badguy/kamikazesnowball.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,15 @@
#include "badguy/kamikazesnowball.hpp"

#include "audio/sound_manager.hpp"
#include "sprite/sprite.hpp"
#include "sprite/sprite_manager.hpp"

namespace{
static const float KAMIKAZE_SPEED = 200;
static const float LEAFSHOT_SPEED = 400;
const std::string SPLAT_SOUND = "sounds/splat.wav";
}

KamikazeSnowball::KamikazeSnowball(const ReaderMapping& reader) :
BadGuy(reader, "images/creatures/snowball/kamikaze-snowball.sprite")
KamikazeSnowball::KamikazeSnowball(const ReaderMapping& reader, const std::string& sprite_name) :
BadGuy(reader, sprite_name)
{
SoundManager::current()->preload(SPLAT_SOUND);
set_action (m_dir == Direction::LEFT ? "left" : "right", /* loops = */ -1);
Expand Down Expand Up @@ -100,10 +98,8 @@ KamikazeSnowball::collision_player(Player& player, const CollisionHit& hit)
}

LeafShot::LeafShot(const ReaderMapping& reader) :
KamikazeSnowball(reader)
KamikazeSnowball(reader, "images/creatures/leafshot/leafshot.sprite")
{
m_sprite_name = "images/creatures/leafshot/leafshot.sprite";
m_sprite = SpriteManager::current()->create(m_sprite_name);
}

void
Expand Down
3 changes: 2 additions & 1 deletion src/badguy/kamikazesnowball.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
class KamikazeSnowball : public BadGuy
{
public:
KamikazeSnowball(const ReaderMapping& reader);
KamikazeSnowball(const ReaderMapping& reader,
const std::string& sprite_name = "images/creatures/snowball/kamikaze-snowball.sprite");

virtual void initialize() override;
virtual void collision_solid(const CollisionHit& hit) override;
Expand Down
11 changes: 0 additions & 11 deletions src/badguy/mrbomb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,6 @@ MrBomb::MrBomb(const ReaderMapping& reader) :

//Prevent stutter when Tux jumps on Mr Bomb
SoundManager::current()->preload("sounds/explosion.wav");

//Check if we need another sprite
if ( !reader.get( "sprite", m_sprite_name ) ){
return;
}
if (m_sprite_name.empty()) {
m_sprite_name = "images/creatures/mr_bomb/mr_bomb.sprite";
return;
}
//Replace sprite
m_sprite = SpriteManager::current()->create( m_sprite_name );
}

HitResponse
Expand Down
4 changes: 2 additions & 2 deletions src/badguy/mriceblock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ namespace {
const float NOKICK_TIME = 0.1f;
}

MrIceBlock::MrIceBlock(const ReaderMapping& reader) :
WalkingBadguy(reader, "images/creatures/iceblock/iceblock.sprite", "left", "right"),
MrIceBlock::MrIceBlock(const ReaderMapping& reader, const std::string& sprite_name) :
WalkingBadguy(reader, sprite_name, "left", "right"),
ice_state(ICESTATE_NORMAL),
nokick_timer(),
flat_timer(),
Expand Down
3 changes: 2 additions & 1 deletion src/badguy/mriceblock.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
class MrIceBlock : public WalkingBadguy
{
public:
MrIceBlock(const ReaderMapping& reader);
MrIceBlock(const ReaderMapping& reader,
const std::string& sprite_name = "images/creatures/iceblock/iceblock.sprite");

virtual void initialize() override;
virtual HitResponse collision(GameObject& object, const CollisionHit& hit) override;
Expand Down
11 changes: 0 additions & 11 deletions src/badguy/short_fuse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,6 @@ ShortFuse::ShortFuse(const ReaderMapping& reader) :
walk_speed = 100;
max_drop_height = 16;

//Check if we need another sprite
if ( !reader.get( "sprite", m_sprite_name ) ){
return;
}
if (m_sprite_name.empty()) {
m_sprite_name = "images/creatures/short_fuse/short_fuse.sprite";
return;
}
//Replace sprite
m_sprite = SpriteManager::current()->create( m_sprite_name );

SoundManager::current()->preload("sounds/firecracker.ogg");
}

Expand Down
11 changes: 1 addition & 10 deletions src/badguy/smartblock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,10 @@

#include "badguy/smartblock.hpp"

#include "sprite/sprite_manager.hpp"
#include "util/reader_mapping.hpp"

SmartBlock::SmartBlock(const ReaderMapping& reader) :
MrIceBlock(reader)
MrIceBlock(reader, "images/creatures/iceblock/smart_block.sprite")
{
max_drop_height = 16;
m_default_sprite_name = "images/creatures/iceblock/smart_block.sprite";

if (!reader.get("sprite", m_sprite_name)) {
m_sprite_name = m_default_sprite_name;
}
m_sprite = SpriteManager::current()->create(m_sprite_name);
}

/* EOF */
35 changes: 5 additions & 30 deletions src/object/block.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@
#include "object/growup.hpp"
#include "object/player.hpp"
#include "object/sprite_particle.hpp"
#include "sprite/sprite.hpp"
#include "sprite/sprite_manager.hpp"
#include "supertux/constants.hpp"
#include "supertux/flip_level_transformer.hpp"
#include "supertux/sector.hpp"
Expand All @@ -38,16 +36,13 @@ static const float BOUNCY_BRICK_MAX_OFFSET = 8;
static const float BOUNCY_BRICK_SPEED = 90;
static const float BUMP_ROTATION_ANGLE = 10;

Block::Block(SpritePtr newsprite) :
m_sprite(std::move(newsprite)),
m_sprite_name(),
m_default_sprite_name(),
Block::Block(const Vector& pos, const std::string& sprite_file) :
MovingSprite(pos, sprite_file),
m_bouncing(false),
m_breaking(false),
m_bounce_dir(0),
m_bounce_offset(0),
m_original_y(-1),
m_flip(NO_FLIP)
m_original_y(-1)
{
m_col.m_bbox.set_size(32, 32.1f);
set_group(COLGROUP_STATIC);
Expand All @@ -56,28 +51,13 @@ Block::Block(SpritePtr newsprite) :
}

Block::Block(const ReaderMapping& mapping, const std::string& sprite_file) :
m_sprite(),
m_sprite_name(),
m_default_sprite_name(),
MovingSprite(mapping, sprite_file),
m_bouncing(false),
m_breaking(false),
m_bounce_dir(0),
m_bounce_offset(0),
m_original_y(-1),
m_flip(NO_FLIP)
m_original_y(-1)
{
mapping.get("x", m_col.m_bbox.get_left());
mapping.get("y", m_col.m_bbox.get_top());

std::string sf;
mapping.get("sprite", sf);
if (sf.empty() || !PHYSFS_exists(sf.c_str())) {
sf = sprite_file;
}
m_sprite = SpriteManager::current()->create(sf);
m_sprite_name = sf;
m_default_sprite_name = sprite_file;

m_col.m_bbox.set_size(32, 32.1f);
set_group(COLGROUP_STATIC);
SoundManager::current()->preload("sounds/upgrade.wav");
Expand Down Expand Up @@ -237,11 +217,6 @@ Block::get_settings()
return result;
}

void Block::after_editor_set()
{
m_sprite = SpriteManager::current()->create(m_sprite_name);
}

void
Block::on_flip(float height)
{
Expand Down
18 changes: 3 additions & 15 deletions src/object/block.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,30 +17,24 @@
#ifndef HEADER_SUPERTUX_OBJECT_BLOCK_HPP
#define HEADER_SUPERTUX_OBJECT_BLOCK_HPP

#include "sprite/sprite.hpp"
#include "sprite/sprite_ptr.hpp"
#include "supertux/moving_object.hpp"
#include "video/flip.hpp"
#include "object/moving_sprite.hpp"

class Player;
class ReaderMapping;

class Block : public MovingObject
class Block : public MovingSprite
{
friend class FlipLevelTransformer;

public:
Block(SpritePtr sprite);
Block(const Vector& pos, const std::string& sprite_file);
Block(const ReaderMapping& mapping, const std::string& sprite_file);

virtual HitResponse collision(GameObject& other, const CollisionHit& hit) override;
virtual void update(float dt_sec) override;
virtual void draw(DrawingContext& context) override;

virtual std::string get_default_sprite_name() const { return m_default_sprite_name; }

virtual ObjectSettings get_settings() override;
virtual void after_editor_set() override;

virtual void on_flip(float height) override;

Expand All @@ -55,18 +49,12 @@ class Block : public MovingObject
void break_me();

protected:
SpritePtr m_sprite;
std::string m_sprite_name;
std::string m_default_sprite_name;
bool m_bouncing;
bool m_breaking;
float m_bounce_dir;
float m_bounce_offset;
float m_original_y;

private:
Flip m_flip;

private:
Block(const Block&) = delete;
Block& operator=(const Block&) = delete;
Expand Down
20 changes: 7 additions & 13 deletions src/object/bonus_block.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
#include "object/specialriser.hpp"
#include "object/star.hpp"
#include "object/trampoline.hpp"
#include "sprite/sprite_manager.hpp"
#include "supertux/constants.hpp"
#include "supertux/game_object_factory.hpp"
#include "supertux/level.hpp"
Expand All @@ -63,7 +62,7 @@ const float upgrade_sound_gain = 0.3f;
} // namespace

BonusBlock::BonusBlock(const Vector& pos, int tile_data) :
Block(SpriteManager::current()->create("images/objects/bonus_block/bonusblock.sprite")),
Block(pos, "images/objects/bonus_block/bonusblock.sprite"),
m_contents(),
m_object(),
m_hit_counter(1),
Expand All @@ -72,10 +71,7 @@ BonusBlock::BonusBlock(const Vector& pos, int tile_data) :
m_custom_sx(),
m_coin_sprite("images/objects/coin/coin.sprite")
{
m_default_sprite_name = "images/objects/bonus_block/bonusblock.sprite";

m_col.m_bbox.set_pos(pos);
m_sprite->set_action("normal");
set_action("normal");
m_contents = get_content_by_data(tile_data);
preload_contents(tile_data);
}
Expand All @@ -90,8 +86,6 @@ BonusBlock::BonusBlock(const ReaderMapping& mapping) :
m_custom_sx(),
m_coin_sprite("images/objects/coin/coin.sprite")
{
m_default_sprite_name = "images/objects/bonus_block/bonusblock.sprite";

auto iter = mapping.get_iter();
while (iter.next()) {
const std::string& token = iter.get_key();
Expand Down Expand Up @@ -172,7 +166,7 @@ BonusBlock::BonusBlock(const ReaderMapping& mapping) :
SoundManager::current()->preload("sounds/switch.ogg");
m_lightsprite = Surface::from_file("/images/objects/lightmap_light/bonusblock_light.png");
if (m_contents == Content::LIGHT_ON) {
m_sprite->set_action("on");
set_action("on");
}
}
}
Expand Down Expand Up @@ -354,9 +348,9 @@ BonusBlock::try_open(Player* player)
case Content::LIGHT_ON:
{
if (m_sprite->get_action() == "on")
m_sprite->set_action("off");
set_action("off");
else
m_sprite->set_action("on");
set_action("on");
SoundManager::current()->play("sounds/switch.ogg", get_pos());
break;
}
Expand Down Expand Up @@ -406,7 +400,7 @@ BonusBlock::try_open(Player* player)
start_bounce(player);
if (m_hit_counter <= 0 || m_contents == Content::LIGHT || m_contents == Content::LIGHT_ON) { //use 0 to allow infinite hits
} else if (m_hit_counter == 1) {
m_sprite->set_action("empty");
set_action("empty");
} else {
m_hit_counter--;
}
Expand Down Expand Up @@ -550,7 +544,7 @@ BonusBlock::try_drop(Player *player)

if (countdown) { // only decrease hit counter if try_open was not called
if (m_hit_counter == 1) {
m_sprite->set_action("empty");
set_action("empty");
} else {
m_hit_counter--;
}
Expand Down
Loading

0 comments on commit 771e4e2

Please sign in to comment.