- fixed warnings
[supertux.git] / src / gameobjs.cpp
index b440b5c..ce71dee 100644 (file)
@@ -114,7 +114,7 @@ BouncyBrick::draw(DrawingContext& context)
     draw_tile(context, shape.id, position + Vector(0, offset), LAYER_TILES+1);
 }
 
-FloatingText::FloatingText(const Vector& pos, std::string& text_)
+FloatingText::FloatingText(const Vector& pos, const std::string& text_)
   : position(pos), text(text_)
 {
   timer.start(1000);
@@ -155,7 +155,12 @@ FloatingText::draw(DrawingContext& context)
   else
     alpha = 255;
 
-  context.draw_text(gold_text, text, position, LEFT_ALLIGN, LAYER_OBJECTS, NONE_EFFECT, alpha);
+  context.push_transform();
+  context.set_alpha(alpha);
+
+  context.draw_text(gold_text, text, position, LEFT_ALLIGN, LAYER_OBJECTS+1);
+
+  context.pop_transform();
 }
 
 /* Trampoline */
@@ -460,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, int drawing_layer_)
+  : accel(acceleration), color(color_), size(size_), drawing_layer(drawing_layer_)
 {
   if(life_time == 0)
     {
@@ -478,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);
     }
@@ -487,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);
@@ -524,7 +537,7 @@ Particles::draw(DrawingContext& context)
   // draw particles
   for(std::vector<Particle*>::iterator i = particles.begin(); i < particles.end(); i++)
     {
-    context.draw_filled_rect((*i)->pos, Vector(size,size), color, LAYER_OBJECTS+10);
+    context.draw_filled_rect((*i)->pos, Vector(size,size), color, drawing_layer);
     }
 }