热点新闻
用继承实现粒子类
2023-07-07 23:28  浏览:42  搜索引擎搜索“促展会”
温馨提示:为防找不到此信息,请务必收藏信息以备急用! 联系我时,请说明是在促展会看到的信息,谢谢。
展会发布 展会网站大全 报名观展合作 软文发布

书名:代码本色:用编程模拟自然系统
作者: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类的实例。
发布人:2d25****    IP:117.173.57.***     举报/删稿
展会推荐
让朕来说2句
评论
收藏
点赞
转发