Redesigned Particles algorithm.
authorRicardo Cruz <rick2@aeiou.pt>
Fri, 29 Oct 2004 22:49:07 +0000 (22:49 +0000)
committerRicardo Cruz <rick2@aeiou.pt>
Fri, 29 Oct 2004 22:49:07 +0000 (22:49 +0000)
SVN-Revision: 2074

src/gameloop.cpp
src/gameobjs.cpp
src/gameobjs.h
src/sector.cpp
src/sector.h

index e339cbb..7f26d69 100644 (file)
@@ -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
index 5340bfb..1555fc8 100644 (file)
@@ -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<Particle*>::iterator i = particles.begin(); i < particles.end(); i++)
+  for(std::vector<Particle*>::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<Particle*>::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);
index 197273f..a3a354a 100644 (file)
@@ -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 <Particle*> particles;
 };
index 71c7c62..815b321 100644 (file)
@@ -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;
 }
 
index d03f335..9278d6e 100644 (file)
@@ -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 */