X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Ffirefly.cpp;h=49299fb94b46989cb50484a6ebef31ce9d8c108d;hb=77d00a6f464cc87c6b50cf1f3b38064a7ae9aead;hp=dc9adff0b49083dc01f2e2d129c500a17f7f9d30;hpb=15c5a91ee89272dfda3666e2fed67e06d650d0bf;p=supertux.git diff --git a/src/object/firefly.cpp b/src/object/firefly.cpp index dc9adff0b..49299fb94 100644 --- a/src/object/firefly.cpp +++ b/src/object/firefly.cpp @@ -27,10 +27,23 @@ #include "object_factory.hpp" #include "game_session.hpp" #include "sector.hpp" +#include "random_generator.hpp" +#include "object/sprite_particle.hpp" Firefly::Firefly(const lisp::Lisp& lisp) - : MovingSprite(lisp, "images/objects/firefly/firefly.sprite", LAYER_TILES, COLGROUP_TOUCHABLE), activated(false) + : MovingSprite(lisp, "images/objects/resetpoints/default-resetpoint.sprite", LAYER_TILES, COLGROUP_TOUCHABLE), activated(false) { + + if( !lisp.get( "sprite", sprite_name ) ){ + return; + } + if( sprite_name == "" ){ + sprite_name = "images/objects/resetpoints/default-resetpoint.sprite"; + return; + } + //Replace sprite + sprite = sprite_manager->create( sprite_name ); + bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); } void @@ -47,16 +60,28 @@ Firefly::collision(GameObject& other, const CollisionHit& ) { if(activated) return ABORT_MOVE; - + Player* player = dynamic_cast (&other); if(player) { activated = true; +// spawn some particles +// TODO: provide convenience function in MovingSprite or MovingObject? + for (int i = 0; i < 5; i++) { + Vector ppos = bbox.get_middle(); + float angle = systemRandom.randf(-M_PI_2, M_PI_2); + float velocity = systemRandom.randf(450, 900); + float vx = sin(angle)*velocity; + float vy = -cos(angle)*velocity; + Vector pspeed = Vector(vx, vy); + Vector paccel = Vector(0, 1000); + Sector::current()->add_object(new SpriteParticle("images/objects/particles/reset.sprite", "default", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS-1)); + } // TODO play sound sprite->set_action("ringing"); GameSession::current()->set_reset_point(Sector::current()->get_name(), get_pos()); } - + return ABORT_MOVE; }