X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=src%2Fobject%2Fstar.cpp;h=fb505b684094c3da07b3bc20cfa3405b91723cdb;hb=092556fd403b1464402c741f949c48f04f628ee8;hp=191ebf836147e920996ccaf238d661714a8eed82;hpb=42570f1f8f28f5b53c751e47fb9a701c6106900e;p=supertux.git diff --git a/src/object/star.cpp b/src/object/star.cpp index 191ebf836..fb505b684 100644 --- a/src/object/star.cpp +++ b/src/object/star.cpp @@ -14,10 +14,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include "math/random_generator.hpp" #include "object/player.hpp" +#include "object/sprite_particle.hpp" #include "object/star.hpp" #include "sprite/sprite.hpp" #include "sprite/sprite_manager.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" static const float INITIALJUMP = -400; static const float STAR_SPEED = 150; @@ -27,7 +31,7 @@ Star::Star(const Vector& pos, Direction direction) : MovingSprite(pos, "images/powerups/star/star.sprite", LAYER_OBJECTS, COLGROUP_MOVING), physic(), light(0.0f,0.0f,0.0f), - lightsprite(sprite_manager->create("images/objects/lightmap_light/lightmap_light-tiny.sprite")) + lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-small.sprite")) { physic.set_velocity((direction == LEFT) ? -STAR_SPEED : STAR_SPEED, INITIALJUMP); //set light for glow effect @@ -39,6 +43,30 @@ void Star::update(float elapsed_time) { movement = physic.get_movement(elapsed_time); + + // when near Tux, spawn particles + Player* player = Sector::current()->get_nearest_player (this->get_bbox ()); + if (player) { + float disp_x = player->get_bbox().p1.x - bbox.p1.x; + float disp_y = player->get_bbox().p1.y - bbox.p1.y; + if (disp_x*disp_x + disp_y*disp_y <= 256*256) + { + if (graphicsRandom.rand(0, 2) == 0) { + float px = graphicsRandom.randf(bbox.p1.x+0, bbox.p2.x-0); + float py = graphicsRandom.randf(bbox.p1.y+0, bbox.p2.y-0); + Vector ppos = Vector(px, py); + Vector pspeed = Vector(0, 0); + Vector paccel = Vector(0, 0); + Sector::current()->add_object(std::make_shared( + "images/objects/particles/sparkle.sprite", + // draw bright sparkles when very close to Tux, dark sparkles when slightly further + (disp_x*disp_x + disp_y*disp_y <= 128*128) ? + // make every other a longer sparkle to make trail a bit fuzzy + (size_t(game_time*20)%2) ? "small" : "medium" : "dark", + ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS+1+5)); + } + } + } } void @@ -48,6 +76,7 @@ Star::draw(DrawingContext& context){ //Draw the light when dark context.get_light( get_bbox().get_middle(), &light ); if (light.red + light.green + light.blue < 3.0){ + MovingSprite::draw(context); context.push_target(); context.set_target(DrawingContext::LIGHTMAP); lightsprite->draw(context, get_bbox().get_middle(), 0);