用继承实现粒子类

手机软件开发 2024-9-30 09:19:51 121 0 来自 中国
书名:代码本色:用编程模拟自然体系
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
4.8 用继承实现粒子类

  在粒子类上实践继承的用法。
1、简单的Particle类

class Particle {  PVector position;  PVector velocity;  PVector acceleration;  Particle(PVector l) {    acceleration = new PVector(0, 0.05);    velocity = new PVector(random(-1, 1), random(-1, 0));    position = l.get();  }  void run() {    update();    display();  }  void update() {    velocity.add(acceleration);    position.add(velocity);  }  void display() {    fill(0);    ellipse(position.x, position.y, 12, 12);  }}2、子类(类名为Confetti)

继承Particle类。Confetti类会从Particle类中继承全部的变量和方法,我们还要为它界说自己的构造函数,并通过super()函数调用父类的构造函数。
class Confetti extends Particle {    我们可以在这里参加Confetti专有的变量    Confetti(PVector l) {    super(l);    }  这里没有update()的实现,由于我们从父类中继承了update()函数  void display() {   覆盖display方法    rectMode(CENTER);    fill(175);    stroke(0);    rect(location.x, location.y, 8, 8);    }}3、实现

可以把本例实现得稍微复杂一些:让Confetti粒子像苍蝇一样在空中飞动旋转。

  • 对此,可以用第3章里的角速率和角加速率实现旋转
  • 用一种更简单的办理方案。
    我们知道粒子的x坐标,它的值介于0和窗口宽度之间。我们想要实现如许的效果:假如粒子的x坐标为0,它转动的角度也是0;假如x坐标即是窗口宽度,它转动的角度就即是2π。
    对此,你有没有一些想法?是的,我们想把某个区间内的值映射到另一个区间,Processing的map()函数正好能完成如许的利用。
    假如要让旋转效果更加明显,我们可以把角度映射到0和2π*2之间。
    在display()函数中参加以上逻辑:
void display() {    float theta = map(location.x,0,width,0,TWO_PI*2);    rectMode(CENTER);    fill(0,lifespan);    stroke(0,lifespan);    pushMatrix();    translate(location.x, location.y);  利用rotate()函数之前,我们必须认识变更。假如想相识rotate(theta);    rect(0,0,8,8);    popMatrix();  }
4.9 多态根本



  • Dog对象可以当做Dog类的实例,也可以当做Animal类的实例,这就是多态的一个例
    子。
  • 多态(Polymorphism,源自希腊语polymorphos,指多种形态)指的就是把一个实
    例对象当做多重形态。
  • Dog对象肯定是Dog类的实例,Dog类同时继承自Animal类,因此Dog对象也可以当做Animal类的实例。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-21 22:48, Processed in 0.150170 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表