书名:代码本色:用编程模拟自然体系
作者: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< article> particles; PVector origin; ParticleSystem(PVector position) { origin = position.get(); particles = new ArrayList< article>(); } 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、运行结果
|