X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fparticles.cpp;h=36d3b6ef8652620fe3457e835e09d825141e1f4f;hb=64842a0700a2ee8a3d2d61ad2685217f5060985a;hp=f6f066b361b8c808e3485c161a477f0e7f3a7c30;hpb=fea3446f05e1e7673607b835c269d3e8d1929ab3;p=supertux.git diff --git a/src/object/particles.cpp b/src/object/particles.cpp index f6f066b36..36d3b6ef8 100644 --- a/src/object/particles.cpp +++ b/src/object/particles.cpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux // Copyright (C) 2006 Matthias Braun // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,23 +12,29 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// along with this program. If not, see . -#include +#include "object/particles.hpp" #include -#include "particles.hpp" -#include "sector.hpp" -#include "camera.hpp" -#include "main.hpp" -#include "random_generator.hpp" +#include "math/random_generator.hpp" +#include "object/camera.hpp" +#include "supertux/globals.hpp" +#include "supertux/sector.hpp" +#include "video/drawing_context.hpp" +//TODO: remove this function in favor of the one below Particles::Particles(const Vector& epicenter, int min_angle, int max_angle, - const Vector& initial_velocity, const Vector& acceleration, int number, - Color color_, int size_, float life_time, int drawing_layer_) - : accel(acceleration), color(color_), size(size_), drawing_layer(drawing_layer_) + const Vector& initial_velocity, const Vector& acceleration, int number, + Color color_, int size_, float life_time, int drawing_layer_) : + accel(acceleration), + timer(), + live_forever(), + color(color_), + size(size_), + drawing_layer(drawing_layer_), + particles() { if(life_time == 0) { live_forever = true; @@ -41,28 +45,66 @@ Particles::Particles(const Vector& epicenter, int min_angle, int max_angle, // create particles for(int p = 0; p < number; p++) - { + { Particle* particle = new Particle; particle->pos = epicenter; - float angle = systemRandom.rand(min_angle, max_angle) - * (M_PI / 180); // convert to radius (radians?) + float angle = graphicsRandom.rand(min_angle, max_angle) + * (M_PI / 180); // convert to radius (radians?) 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 + // 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; + // if(angle >= M_PI_2 && angle < 3*M_PI_2) + // particle->vel.y *= -1; particles.push_back(particle); - } + } +} + +Particles::Particles(const Vector& epicenter, int min_angle, int max_angle, + const float min_initial_velocity, const float max_initial_velocity, + const Vector& acceleration, int number, Color color_, + int size_, float life_time, int drawing_layer_) : + + accel(acceleration), + timer(), + live_forever(), + color(color_), + size(size_), + drawing_layer(drawing_layer_), + particles() +{ + if(life_time == 0) { + live_forever = true; + } else { + live_forever = false; + timer.start(life_time); + } + + // create particles + for(int p = 0; p < number; p++) + { + Particle* particle = new Particle; + particle->pos = epicenter; + + float velocity = (min_initial_velocity == max_initial_velocity) ? min_initial_velocity : + graphicsRandom.rand(min_initial_velocity, max_initial_velocity); + float angle = (min_angle == max_angle) ? min_angle * (M_PI / 180) : + graphicsRandom.rand(min_angle, max_angle) * (M_PI / 180); // convert to radians + // Note that angle defined as clockwise from vertical (up is zero degrees, right is 90 degrees) + particle->vel.x = (sin(angle)) * velocity; + particle->vel.y = (-cos(angle)) * velocity; + + particles.push_back(particle); + } } Particles::~Particles() { // free particles for(std::vector::iterator i = particles.begin(); - i < particles.end(); i++) + i < particles.end(); ++i) delete (*i); } @@ -98,7 +140,9 @@ Particles::draw(DrawingContext& context) { // draw particles for(std::vector::iterator i = particles.begin(); - i != particles.end(); i++) { + i != particles.end(); ++i) { context.draw_filled_rect((*i)->pos, Vector(size,size), color,drawing_layer); } } + +/* EOF */