X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fgameobjs.cpp;h=5340bfb57b31712ce8c70592b46490391501aa3e;hb=e4db6eb50cd6bcba607858b5e6c4c5d53531ed1f;hp=39d4eb699751fb897d1a060ad5e7639211fd1bae;hpb=76d092bebada7aca0db7435a2810ce749816a056;p=supertux.git diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index 39d4eb699..5340bfb57 100644 --- a/src/gameobjs.cpp +++ b/src/gameobjs.cpp @@ -33,6 +33,7 @@ #include "sector.h" #include "tilemap.h" #include "video/drawing_context.h" +#include "camera.h" BouncyDistro::BouncyDistro(const Vector& pos) : position(pos) @@ -113,27 +114,53 @@ BouncyBrick::draw(DrawingContext& context) draw_tile(context, shape.id, position + Vector(0, offset), LAYER_TILES+1); } -FloatingScore::FloatingScore(const Vector& pos, int score) +FloatingText::FloatingText(const Vector& pos, const std::string& text_) + : position(pos), text(text_) +{ + timer.start(1000); + position.x -= text.size() * 8; +} + +FloatingText::FloatingText(const Vector& pos, int score) : position(pos) { timer.start(1000); + + // turn int into a string + char str[10]; snprintf(str, 10, "%d", score); - position.x -= strlen(str) * 8; + text = str; + + position.x -= text.size() * 8; } void -FloatingScore::action(float elapsed_time) +FloatingText::action(float elapsed_time) { - position.y -= 2 * elapsed_time; + position.y -= 1.4 * elapsed_time; if(!timer.check()) remove_me(); } +#define FADING_TIME 350 + void -FloatingScore::draw(DrawingContext& context) +FloatingText::draw(DrawingContext& context) { - context.draw_text(gold_text, str, position, LAYER_OBJECTS); + // make an alpha animation when disapearing + int alpha; + if(timer.get_left() < FADING_TIME) + alpha = timer.get_left() * 255 / FADING_TIME; + else + alpha = 255; + + context.push_transform(); + context.set_alpha(alpha); + + context.draw_text(gold_text, text, position, LEFT_ALLIGN, LAYER_OBJECTS+1); + + context.pop_transform(); } /* Trampoline */ @@ -441,7 +468,15 @@ SmokeCloud::draw(DrawingContext& context) Particles::Particles(const Vector& epicenter, const Vector& velocity, const Vector& acceleration, int number, Color color_, int size_, int life_time) : color(color_), size(size_), vel(velocity), accel(acceleration) { - timer.start(life_time); + if(life_time == 0) + { + live_forever = true; + } + else + { + live_forever = false; + timer.start(life_time); + } // create particles for(int p = 0; p < number; p++) @@ -467,14 +502,24 @@ Particles::action(float elapsed_time) vel.x += accel.x * elapsed_time; vel.y += accel.y * elapsed_time; + int camera_x = (int)Sector::current()->camera->get_translation().x; + int camera_y = (int)Sector::current()->camera->get_translation().y; + // update particles - for(int p = 0; p < particles.size(); p++) + for(std::vector::iterator i = particles.begin(); i < particles.end(); i++) { - particles[p]->pos.x += sin(particles[p]->angle) * vel.x * elapsed_time; - particles[p]->pos.y += cos(particles[p]->angle) * vel.y * elapsed_time; + (*i)->pos.x += sin((*i)->angle) * vel.x * elapsed_time; + (*i)->pos.y += cos((*i)->angle) * vel.y * elapsed_time; + + if((*i)->pos.x < camera_x || (*i)->pos.x > screen->w + camera_x || + (*i)->pos.y < camera_y || (*i)->pos.y > screen->h + camera_y) + { + delete (*i); + particles.erase(i); + } } - if(!timer.check()) + if((!timer.check() && !live_forever) || particles.size() == 0) remove_me(); } @@ -482,9 +527,9 @@ void Particles::draw(DrawingContext& context) { // draw particles - for(int p = 0; p < particles.size(); p++) + for(std::vector::iterator i = particles.begin(); i < particles.end(); i++) { - context.draw_filled_rect(particles[p]->pos, Vector(size,size), color, LAYER_OBJECTS+10); + context.draw_filled_rect((*i)->pos, Vector(size,size), color, LAYER_OBJECTS+10); } }