书名:代码本色:用编程模拟自然系统
作者: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);
}
}
}
}