2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #include "object/particles.hpp"
21 #include "math/random_generator.hpp"
22 #include "object/camera.hpp"
23 #include "supertux/main.hpp"
24 #include "supertux/sector.hpp"
25 #include "video/drawing_context.hpp"
27 Particles::Particles(const Vector& epicenter, int min_angle, int max_angle,
28 const Vector& initial_velocity, const Vector& acceleration, int number,
29 Color color_, int size_, float life_time, int drawing_layer_) :
35 drawing_layer(drawing_layer_),
42 timer.start(life_time);
46 for(int p = 0; p < number; p++)
48 Particle* particle = new Particle;
49 particle->pos = epicenter;
51 float angle = systemRandom.rand(min_angle, max_angle)
52 * (M_PI / 180); // convert to radius (radians?)
53 particle->vel.x = /*fabs*/(sin(angle)) * initial_velocity.x;
54 // if(angle >= M_PI && angle < M_PI*2)
55 // particle->vel.x *= -1; // work around to fix signal
56 particle->vel.y = /*fabs*/(cos(angle)) * initial_velocity.y;
57 // if(angle >= M_PI_2 && angle < 3*M_PI_2)
58 // particle->vel.y *= -1;
60 particles.push_back(particle);
64 Particles::~Particles()
67 for(std::vector<Particle*>::iterator i = particles.begin();
68 i < particles.end(); i++)
73 Particles::update(float elapsed_time)
75 Vector camera = Sector::current()->camera->get_translation();
78 for(std::vector<Particle*>::iterator i = particles.begin();
79 i != particles.end(); ) {
80 (*i)->pos.x += (*i)->vel.x * elapsed_time;
81 (*i)->pos.y += (*i)->vel.y * elapsed_time;
83 (*i)->vel.x += accel.x * elapsed_time;
84 (*i)->vel.y += accel.y * elapsed_time;
86 if((*i)->pos.x < camera.x || (*i)->pos.x > SCREEN_WIDTH + camera.x ||
87 (*i)->pos.y < camera.y || (*i)->pos.y > SCREEN_HEIGHT + camera.y) {
89 i = particles.erase(i);
95 if((timer.check() && !live_forever) || particles.size() == 0)
100 Particles::draw(DrawingContext& context)
103 for(std::vector<Particle*>::iterator i = particles.begin();
104 i != particles.end(); i++) {
105 context.draw_filled_rect((*i)->pos, Vector(size,size), color,drawing_layer);