用多态实现粒子系统 - 千百度社区-后端论坛-技术交流-千百度社区

用多态实现粒子系统

用多态实现粒子系统

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

4.10 用多态实现粒子系统

  • 我们假设没有多态的存在,
    这时要实现前面的粒子系统类,使粒子系统同时包含多个粒子对象和Confetti对象。
    创建了两个列表,一个用于存放粒子对象,另一个用于存放Confetti对
    象。我们要对同样的操作重复两次!

  • 有了面向对象的多态,以上代码就能得到简化:
    只需创建一个ArrayList,同时存放粒子对象和Confetti对象。
    我们并不需要关心获得的对象属于什么类型,多态会替我们完成这些事情!

1、示例

示例代码4-5 粒子系统的继承和多态

ParticleSystem ps;

void setup() {
  size(640,360);
  ps = new ParticleSystem(new PVector(width/2,50));
}

void draw() {
  background(255);
  ps.addParticle();
  ps.run();
}

2、Particle.pde 粒子类

(同前,略)

3、Confetti.pde 继承类(方块带旋转的粒子)

class Confetti extends Particle {

  // We could add variables for only Confetti here if we so

  Confetti(PVector l) {
    super(l);
  }

  // Inherits update() from parent

  // Override the display method
  void display() {
    rectMode(CENTER);
    fill(c,lifespan);
    stroke(0,lifespan);
    strokeWeight(2);
    pushMatrix();
    translate(position.x,position.y);
    float theta = map(position.x,0,width,0,TWO_PI*2);
    rotate(theta);
    rect(0,0,12,12);
    popMatrix();
  }
}

4、ParticleSystem.pde 粒子系统类(多态)

class ParticleSystem {
  ArrayList<Particle> particles;
  PVector origin;

  ParticleSystem(PVector position) {
    origin = position.get();
    particles = new ArrayList<Particle>();
  }

  void addParticle() {
    float r = random(1);
    if (r < 0.5) { 
      particles.add(new Particle(origin));
    } 
    else {
      particles.add(new Confetti(origin));
    }
  }

  void run() {
    for (int i = particles.size()-1; i >= 0; i--) {
      Particle p = particles.get(i);
      p.run();
      if (p.isDead()) {
        particles.remove(i);
      }
    }
  }
}

5、运行结果

© 著作权归作者所有,转载或内容合作请联系作者

请登录后发表评论

    没有回复内容