Skip to content

Commit dd6b114

Browse files
Shatter shards on impact
Makes shards less annoying. With this change, there is no need for them to be a sticky object, a moving sprite is just enough and makes them less complex. Fixes SuperTux#3134
1 parent 15dfac1 commit dd6b114

File tree

2 files changed

+17
-26
lines changed

2 files changed

+17
-26
lines changed

src/object/shard.cpp

+14-20
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,16 @@
2525
#include "util/reader_mapping.hpp"
2626

2727
Shard::Shard(const ReaderMapping& reader) :
28-
StickyObject(reader, "images/creatures/crystallo/shard.sprite", LAYER_TILES - 2, COLGROUP_MOVING),
29-
m_physic(),
30-
m_stick_timer()
28+
MovingSprite(reader, "images/creatures/crystallo/shard.sprite", LAYER_TILES - 2, COLGROUP_MOVING),
29+
m_physic()
3130
{
3231
m_physic.enable_gravity(true);
3332
SoundManager::current()->preload("sounds/crystallo-shardhit.ogg");
3433
}
3534

3635
Shard::Shard(const Vector& pos, const Vector& velocity, const std::string& sprite) :
37-
StickyObject(pos, sprite, LAYER_TILES - 2, COLGROUP_MOVING),
38-
m_physic(),
39-
m_stick_timer()
36+
MovingSprite(pos, sprite, LAYER_TILES - 2, COLGROUP_MOVING),
37+
m_physic()
4038
{
4139
m_physic.enable_gravity(true);
4240
m_physic.set_velocity(velocity);
@@ -47,29 +45,19 @@ Shard::Shard(const Vector& pos, const Vector& velocity, const std::string& sprit
4745
void
4846
Shard::update(float dt_sec)
4947
{
50-
m_sticky = true;
51-
52-
if (m_physic.get_velocity() != Vector(0.f, 0.f) && !m_sticking)
48+
if (m_physic.get_velocity() != Vector(0.f, 0.f))
5349
m_sprite->set_angle(math::degrees(math::angle(Vector(m_physic.get_velocity_x(), m_physic.get_velocity_y()))));
54-
if (m_stick_timer.check())
55-
remove_me();
5650

5751
m_col.set_movement(m_physic.get_movement(dt_sec));
5852

59-
StickyObject::update(dt_sec);
53+
MovingSprite::update(dt_sec);
6054
}
6155

6256
void
6357
Shard::collision_solid(const CollisionHit& hit)
6458
{
65-
m_physic.set_velocity(0.f, 0.f);
66-
m_physic.set_acceleration(0.f, 0.f);
67-
m_physic.enable_gravity(hit.bottom);
68-
if (!m_stick_timer.started())
69-
{
70-
m_stick_timer.start(5.f);
71-
SoundManager::current()->play("sounds/crystallo-shardhit.ogg", get_pos());
72-
}
59+
SoundManager::current()->play("sounds/crystallo-shardhit.ogg", get_pos());
60+
remove_me();
7361
}
7462

7563
HitResponse
@@ -82,11 +70,17 @@ Shard::collision(MovingObject& other, const CollisionHit&)
8270
// kill badguys
8371
auto badguy = dynamic_cast<BadGuy*>(&other);
8472
if (badguy != nullptr)
73+
{
8574
badguy->kill_fall();
75+
remove_me();
76+
}
8677
// kill players
8778
auto player = dynamic_cast<Player*>(&other);
8879
if (player != nullptr)
80+
{
8981
player->kill(false);
82+
remove_me();
83+
}
9084
return ABORT_MOVE;
9185
}
9286

src/object/shard.hpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
#ifndef HEADER_SUPERTUX_OBJECT_SHARD_HPP
1818
#define HEADER_SUPERTUX_OBJECT_SHARD_HPP
1919

20-
#include "object/sticky_object.hpp"
20+
#include "object/moving_sprite.hpp"
2121
#include "supertux/physic.hpp"
2222
#include "supertux/timer.hpp"
2323

24-
class Shard final : public StickyObject
24+
class Shard final : public MovingSprite
2525
{
2626
public:
2727
Shard(const ReaderMapping& reader);
@@ -34,14 +34,11 @@ class Shard final : public StickyObject
3434
virtual std::string get_class_name() const override { return class_name(); }
3535
static std::string display_name() { return _("Shard"); }
3636
virtual std::string get_display_name() const override { return display_name(); }
37-
virtual GameObjectClasses get_class_types() const override { return StickyObject::get_class_types().add(typeid(Shard)); }
37+
virtual GameObjectClasses get_class_types() const override { return MovingSprite::get_class_types().add(typeid(Shard)); }
3838

3939
protected:
4040
Physic m_physic;
4141

42-
private:
43-
Timer m_stick_timer;
44-
4542
private:
4643
Shard(const Shard&) = delete;
4744
Shard& operator=(const Shard&) = delete;

0 commit comments

Comments
 (0)