- particles.push_back(particle);
- }
-}
-
-void
-RainParticleSystem::parse(const lisp::Lisp& reader)
-{
- reader.get("layer", layer);
-}
-
-void
-RainParticleSystem::write(lisp::Writer& writer)
-{
- writer.start_list("particles-rain");
- writer.write_int("layer", layer);
- writer.end_list("particles-rain");
-}
-
-RainParticleSystem::~RainParticleSystem()
-{
- for(int i=0;i<2;++i)
- delete rainimages[i];
-}
-
-void RainParticleSystem::update(float elapsed_time)
-{
- std::vector<Particle*>::iterator i;
- for(
- i = particles.begin(); i != particles.end(); ++i) {
- RainParticle* particle = (RainParticle*) *i;
- float movement = particle->speed * elapsed_time;
- float abs_x = Sector::current()->camera->get_translation().x;
- float abs_y = Sector::current()->camera->get_translation().y;
- particle->pos.y += movement;
- particle->pos.x -= movement;
- int col = collision(particle, Vector(-movement, movement));
- if ((particle->pos.y > SCREEN_HEIGHT + abs_y) || (col >= 0)) {
- //Create rainsplash
- if ((particle->pos.y <= SCREEN_HEIGHT + abs_y) && (col >= 1)){
- bool vertical = (col == 2);
- int splash_x, splash_y;
- if (!vertical) { //check if collision happened from above
- splash_x = int(particle->pos.x);
- splash_y = int(particle->pos.y) - (int(particle->pos.y) % 32) + 32;
- Sector::current()->add_object(new RainSplash(Vector(splash_x, splash_y),vertical));
- }
- // Uncomment the following to display vertical splashes, too
- /* else {
- splash_x = int(particle->pos.x) - (int(particle->pos.x) % 32) + 32;
- splash_y = int(particle->pos.y);
- Sector::current()->add_object(new RainSplash(Vector(splash_x, splash_y),vertical));
- } */
- }
- int new_x = (rand() % int(virtual_width)) + int(abs_x);
- int new_y = 0;
- //FIXME: Don't move particles over solid tiles
- particle->pos.x = new_x;
- particle->pos.y = new_y;
- }
- }
-}
-
-CometParticleSystem::CometParticleSystem()
-{
- cometimages[0] = new Surface("images/creatures/mr_bomb/exploding-left-0.png");
- cometimages[1] = new Surface("images/creatures/mr_bomb/exploding-left-0.png");
-
- virtual_width = SCREEN_WIDTH * 2;
-
- // create some random comets
- size_t cometcount = 2;
- for(size_t i=0; i<cometcount; ++i) {
- CometParticle* particle = new CometParticle;
- particle->pos.x = rand() % int(virtual_width);
- particle->pos.y = rand() % int(virtual_height);
- int cometsize = rand() % 2;
- particle->texture = cometimages[cometsize];
- do {
- particle->speed = (cometsize+1)*30 + (float(rand()%10)*.4);
- } while(particle->speed < 1);
- particle->speed *= 10; // gravity
-
- particles.push_back(particle);