diff --git a/assets/assets/images/powerup_1up.png b/assets/assets/images/powerup_1up.png new file mode 100644 index 0000000..e892d0c Binary files /dev/null and b/assets/assets/images/powerup_1up.png differ diff --git a/assets/assets/images/powerup_beam.png b/assets/assets/images/powerup_beam.png new file mode 100644 index 0000000..672dd01 Binary files /dev/null and b/assets/assets/images/powerup_beam.png differ diff --git a/src/spaced/spaced/game/powerup.cpp b/src/spaced/spaced/game/powerup.cpp index 7f6c45b..9c04076 100644 --- a/src/spaced/spaced/game/powerup.cpp +++ b/src/spaced/spaced/game/powerup.cpp @@ -9,12 +9,12 @@ using bave::Resources; using bave::Seconds; using bave::Services; using bave::Shader; +using bave::Texture; Powerup::Powerup(Services const& services, std::string_view const name) : m_services(&services), m_layout(&services.get()), m_audio(&services.get()), m_name(name) { - auto circle = Circle{}; - circle.diameter = 40.0f; - shape.set_shape(circle); + + sprite.set_size({80., 80.}); auto const& resources = services.get(); if (auto const pu_emitter = resources.get("assets/particles/powerup.json")) { emitter = *pu_emitter; } @@ -23,10 +23,10 @@ Powerup::Powerup(Services const& services, std::string_view const name) } void Powerup::tick(Seconds const dt) { - shape.transform.position.x -= speed * dt.count(); - if (shape.transform.position.x < m_layout->play_area.lt.x - 0.5f * shape.get_shape().diameter) { m_destroyed = true; } + sprite.transform.position.x -= speed * dt.count(); + if (sprite.transform.position.x < m_layout->play_area.lt.x - 0.5f * sprite.get_size().x - 300.) { m_destroyed = true; } - emitter.set_position(shape.transform.position); + emitter.set_position(sprite.transform.position); if (!m_emitter_ticked) { m_emitter_ticked = true; emitter.pre_warm(); @@ -35,8 +35,8 @@ void Powerup::tick(Seconds const dt) { } void Powerup::draw(Shader& shader) const { - shape.draw(shader); emitter.draw(shader); + sprite.draw(shader); } void Powerup::activate(Player& player) { diff --git a/src/spaced/spaced/game/powerup.hpp b/src/spaced/spaced/game/powerup.hpp index 7788f66..a09e79b 100644 --- a/src/spaced/spaced/game/powerup.hpp +++ b/src/spaced/spaced/game/powerup.hpp @@ -16,13 +16,13 @@ class Powerup : public bave::IDrawable { void tick(bave::Seconds dt); void draw(bave::Shader& shader) const final; - [[nodiscard]] auto get_bounds() const -> bave::Rect<> { return shape.get_bounds(); } + [[nodiscard]] auto get_bounds() const -> bave::Rect<> { return sprite.get_bounds(); } void activate(Player& player); [[nodiscard]] auto is_destroyed() const -> bool { return m_destroyed; } float speed{300.0f}; - bave::CircleShape shape{}; + bave::Sprite sprite{}; bave::ParticleEmitter emitter{}; protected: diff --git a/src/spaced/spaced/game/powerups/beam.cpp b/src/spaced/spaced/game/powerups/beam.cpp index e37b985..66f8b4e 100644 --- a/src/spaced/spaced/game/powerups/beam.cpp +++ b/src/spaced/spaced/game/powerups/beam.cpp @@ -1,15 +1,21 @@ +#include #include #include #include #include namespace spaced::powerup { +using bave::Resources; using bave::Services; using bave::Styles; +using bave::Texture; Beam::Beam(Services const& services, int rounds) : Powerup(services, "Beam"), m_rounds(rounds) { - emitter.config.lerp.tint.lo = emitter.config.lerp.tint.hi = shape.tint = services.get().rgbas["gun_beam"]; + emitter.config.lerp.tint.lo = emitter.config.lerp.tint.hi = services.get().rgbas["gun_beam"]; emitter.config.lerp.tint.hi.channels.w = 0; + + auto const& resources = services.get(); + sprite.set_texture(resources.get("assets/images/powerup_beam.png")); } void Beam::do_activate(Player& player) { diff --git a/src/spaced/spaced/game/powerups/one_up.cpp b/src/spaced/spaced/game/powerups/one_up.cpp index accf490..f1e47db 100644 --- a/src/spaced/spaced/game/powerups/one_up.cpp +++ b/src/spaced/spaced/game/powerups/one_up.cpp @@ -1,14 +1,20 @@ +#include #include #include #include namespace spaced::powerup { +using bave::Resources; using bave::Services; using bave::Styles; +using bave::Texture; OneUp::OneUp(Services const& services) : Powerup(services, "OneUp") { - emitter.config.lerp.tint.lo = emitter.config.lerp.tint.hi = shape.tint = services.get().rgbas["exhaust"]; + emitter.config.lerp.tint.lo = emitter.config.lerp.tint.hi = services.get().rgbas["exhaust"]; emitter.config.lerp.tint.hi.channels.w = 0; + + auto const& resources = services.get(); + sprite.set_texture(resources.get("assets/images/powerup_1up.png")); } void OneUp::do_activate(Player& player) { player.one_up(); } diff --git a/src/spaced/spaced/scenes/endless.cpp b/src/spaced/spaced/scenes/endless.cpp index 67d0288..b6ad7f1 100644 --- a/src/spaced/spaced/scenes/endless.cpp +++ b/src/spaced/spaced/scenes/endless.cpp @@ -134,7 +134,7 @@ void EndlessScene::on_player_scored(Enemy const& enemy) { if (!powerup) { return; } - powerup->shape.transform.position = enemy.get_position(); + powerup->sprite.transform.position = enemy.get_position(); push_powerup(std::move(powerup)); m_since_powerup = 0s; } diff --git a/src/spaced/spaced/scenes/game.cpp b/src/spaced/spaced/scenes/game.cpp index dce1a4d..513dd68 100644 --- a/src/spaced/spaced/scenes/game.cpp +++ b/src/spaced/spaced/scenes/game.cpp @@ -78,6 +78,8 @@ auto GameScene::get_asset_manifest() -> AssetManifest { "assets/images/round_kinetic_green.png", "assets/images/round_kinetic_red.png", "assets/images/round_beam.png", + "assets/images/powerup_beam.png", + "assets/images/powerup_1up.png", }, .audio_clips = {