OneHourProcessing 八日目

OneHourProcessing 八日目

今日作ったのはこちら

作るのにかかった時間は「1時間20分」

コード

PVector Gravity = new PVector(0, 0.05);
ArrayList<Firework> fireworks = new ArrayList<Firework>();

void setup()
{
  size(800, 450);
  noStroke();
}

void draw()
{
  background(0);
  for (Firework firework : fireworks)
  {
    firework.update(Gravity);
    firework.display();
  }
  for (int i = 0; i < fireworks.size(); i++)
    if (fireworks.get(i).life < -10 && fireworks.get(i).particles.size() == 0)
    {
      fireworks.remove(i);
      i--;
    }
}

void setFirework()
{
  Firework firework = new Firework(new PVector(random(width), height), 5, 35, color(255), new PVector(0, -10));
  firework.setParticle(int(random(10, 20)), 3, int(random(50, 70)), color(int(random(150, 255)), int(random(150, 255)), int(random(150, 255))), random(3, 4));
  fireworks.add(firework);
}

void mouseReleased()
{
  setFirework();
}

Fireworkクラス

class Firework extends Particle
{
  ArrayList<Particle> particles = new ArrayList<Particle>();
  int particle_num;
  float particle_radius;
  float particle_initial;
  color particle_color;
  int particle_life;

  Firework(PVector pos, float radius, int life, color col, PVector initial)
  {
    super(pos, radius, life, col);
    vec = initial;
  }

  void setParticle(int particle_num, float particle_radius, int particle_life, color particle_color, float particle_initial)
  {
    this.particle_num     = particle_num;
    this.particle_radius  = particle_radius;
    this.particle_initial = particle_initial;
    this.particle_color   = particle_color;
    this.particle_life    = particle_life;
  }

  void update(PVector Gravity)
  {
    addVector(Gravity);
    super.update();

    makeParticle();

    if (particles.size() == 0)
      return;

    for (Particle particle : particles)
    {
      particle.addVector(Gravity);
      particle.update();
    }

    for (int i = 0; i < particles.size(); i++)
      if (particles.get(i).life < 0)
      {
        particles.remove(i);
        i--;
      }
  }

  void display()
  {
    super.display();
    if (particles.size() == 0)
      return;

    for (Particle particle : particles)
      particle.display();
  }

  void makeParticle()
  {
    if (life != 0)
      return;

    float rad = PI / particle_num;

    for (int i = 0; i <= particle_num; i++)
      for (int j = 0; j <= particle_num; j++)
      {
        Particle particle = new Particle(new PVector(pos.x, pos.y), particle_radius, particle_life, particle_color);
        particle.vec = new PVector(cos(i * rad) * particle_initial, sin(i * rad) * cos(j * rad) * particle_initial);
        particles.add(particle);
      }
  }
}

Particleクラス

class Particle
{
  PVector pos;
  PVector vec;
  PVector acc;
  float radius;
  int life;
  color col;
  
  Particle(PVector pos, float radius, int life, color col)
  {
    this.pos    = pos;
    this.radius = radius;
    this.life   = life;
    this.col    = col;
    
    vec = new PVector(0, 0);
    acc = new PVector(0, 0);
  }
  
  void update()
  {
    life--;
    vec.add(acc);
    pos.add(vec);
    acc.mult(0);
  }
  
  void display()
  {
    //fill(col);
    fill(col, life * 10);
    ellipse(pos.x, pos.y, radius * 2, radius * 2);
  }
  
  void addVector(PVector addVec)
  {
    acc.add(addVec);
  }
}