From: Ricardo Cruz Date: Fri, 29 Oct 2004 22:49:07 +0000 (+0000) Subject: Redesigned Particles algorithm. X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=b88f36237b1e9d3584d15a4c322bc5d49fe5d95d;p=supertux.git Redesigned Particles algorithm. SVN-Revision: 2074 --- diff --git a/src/gameloop.cpp b/src/gameloop.cpp index e339cbb8a..7f26d6932 100644 --- a/src/gameloop.cpp +++ b/src/gameloop.cpp @@ -638,8 +638,8 @@ GameSession::action(double frame_ratio) int red = rand() % 255; // calculate firework color int green = rand() % red; - currentsector->add_particles(epicenter, Vector(1.4,1.4), Vector(0,0), - 45, Color(red,green,0), 3, 1300); + currentsector->add_particles(epicenter, 0, 360, Vector(1.4,1.4), + Vector(0,0), 45, Color(red,green,0), 3, 1300); SoundManager::get()->play_sound(IDToSound(SND_FIREWORKS)); random_timer.start(rand() % 400 + 600); // next firework diff --git a/src/gameobjs.cpp b/src/gameobjs.cpp index 5340bfb57..1555fc806 100644 --- a/src/gameobjs.cpp +++ b/src/gameobjs.cpp @@ -465,8 +465,8 @@ SmokeCloud::draw(DrawingContext& context) img_smoke_cloud->draw(context, position, LAYER_OBJECTS+1); } -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) +Particles::Particles(const Vector& epicenter, int min_angle, int max_angle, const Vector& initial_velocity, const Vector& acceleration, int number, Color color_, int size_, int life_time) + : color(color_), size(size_), accel(acceleration) { if(life_time == 0) { @@ -483,7 +483,15 @@ Particles::Particles(const Vector& epicenter, const Vector& velocity, const Vect { Particle* particle = new Particle; particle->pos = epicenter; - particle->angle = (rand() % 360) * (M_PI / 180); // in radius + + float angle = ((rand() % (max_angle-min_angle))+min_angle) + * (M_PI / 180); // convert to radius + particle->vel.x = /*fabs*/(sin(angle)) * initial_velocity.x; +// if(angle >= M_PI && angle < M_PI*2) +// particle->vel.x *= -1; // work around to fix signal + particle->vel.y = /*fabs*/(cos(angle)) * initial_velocity.y; +// if(angle >= M_PI_2 && angle < 3*M_PI_2) +// particle->vel.y *= -1; particles.push_back(particle); } @@ -492,27 +500,27 @@ Particles::Particles(const Vector& epicenter, const Vector& velocity, const Vect Particles::~Particles() { // free particles - for(std::vector::iterator i = particles.begin(); i < particles.end(); i++) + for(std::vector::iterator i = particles.begin(); + i < particles.end(); i++) delete (*i); } void 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; + Vector camera = Sector::current()->camera->get_translation(); // update particles for(std::vector::iterator i = particles.begin(); i < particles.end(); i++) { - (*i)->pos.x += sin((*i)->angle) * vel.x * elapsed_time; - (*i)->pos.y += cos((*i)->angle) * vel.y * elapsed_time; + (*i)->pos.x += (*i)->vel.x * elapsed_time; + (*i)->pos.y += (*i)->vel.y * elapsed_time; + + (*i)->vel.x += accel.x * elapsed_time; + (*i)->vel.y += accel.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) + 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); diff --git a/src/gameobjs.h b/src/gameobjs.h index 197273f0a..a3a354ac6 100644 --- a/src/gameobjs.h +++ b/src/gameobjs.h @@ -180,7 +180,9 @@ private: class Particles : public GameObject { public: - Particles(const Vector& epicenter, const Vector& velocity, const Vector& acceleration, int number, Color color, int size, int life_time); + Particles(const Vector& epicenter, int min_angle, int max_angle, + const Vector& initial_velocity, const Vector& acceleration, + int number, Color color, int size, int life_time); ~Particles(); virtual void action(float elapsed_time); @@ -189,13 +191,13 @@ public: private: Color color; float size; - Vector vel, accel; + Vector accel; Timer timer; bool live_forever; struct Particle { - Vector pos; - float angle; + Vector pos, vel; +// float angle; }; std::vector particles; }; diff --git a/src/sector.cpp b/src/sector.cpp index 71c7c6293..815b321ae 100644 --- a/src/sector.cpp +++ b/src/sector.cpp @@ -769,9 +769,9 @@ Sector::add_smoke_cloud(const Vector& pos) } bool -Sector::add_particles(const Vector& epicenter, const Vector& velocity, const Vector& acceleration, int number, Color color, int size, int life_time) +Sector::add_particles(const Vector& epicenter, int min_angle, int max_angle, const Vector& initial_velocity, const Vector& acceleration, int number, Color color, int size, int life_time) { - add_object(new Particles(epicenter, velocity, acceleration, number, color, size, life_time)); + add_object(new Particles(epicenter, min_angle, max_angle, initial_velocity, acceleration, number, color, size, life_time)); return true; } diff --git a/src/sector.h b/src/sector.h index d03f335c9..9278d6eb9 100644 --- a/src/sector.h +++ b/src/sector.h @@ -114,7 +114,7 @@ public: void add_upgrade(const Vector& pos, Direction dir, UpgradeKind kind); bool add_bullet(const Vector& pos, float xm, Direction dir); bool add_smoke_cloud(const Vector& pos); - bool add_particles(const Vector& epicenter, const Vector& velocity, const Vector& acceleration, int number, Color color, int size, int life_time); + bool add_particles(const Vector& epicenter, int min_angle, int max_angle, const Vector& initial_velocity, const Vector& acceleration, int number, Color color, int size, int life_time); void add_floating_text(const Vector& pos, const std::string& text); /** Try to grab the coin at the given coordinates */