toxiclibs中的粒子和弹簧

计算机软件开发 2024-10-1 08:43:42 15 0 来自 中国
书名:代码本色:用编程模仿天然体系
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目次
5.16 toxiclibs中的粒子和弹簧

1、粒子


  • 在Box2D的例子中,我们创建了本身的类(比如Particle类),并在此中参加了一个Box2D物体对象变量。
class Particle {    Body body;

  • 如许的实现方式显得有些多余,由于Box2D在内部维护了全部物体对象。但是,这种写法允许我们直接获取物体对象的某些信息(继而得到物体的绘制方式),而不须要遍历Box2D内部的对象列表。
  • 让我们看看怎样将同样的方法作用在toxiclibs的VerletParticle2D类中。为了方便地绘制粒子对象,并在粒子中参加某些自界说属性,我们还是要界说本身的Particle类。代码如下所示:
class Particle {    VerletParticle2D p; 粒子对象有一个指向VerletParticle对象的引用    Particle(Vec2D pos) {    p = new VerletParticle2D(pos); VerletParticle对象须要一个初始位置(x坐标和y坐标)}void display() {    fill(0,150);    stroke(0);    ellipse(p.x,p.y,16,16); 当我们在绘制粒子时,须要向VerletParticle对象扣问x坐标和y坐}}

  • 从上面的代码可以看出,绘制粒子是一件很简朴的事,可以直接使
    用VerletParticle2D对象的x坐标和y坐标,不须要烦琐的坐标转换,由于toxiclibs用的就是像素坐标。
  • 除此之外,你还会发现这个粒子类只有一个作用,那就是存放VerletParticle2D对象的引用。请回首第4章讨论的继承特性:这也是一个粒子体系,除了存放VerletParticle2D对象的引用,粒子对象尚有什么其他特性?我们是否可以让Particle类继承VerletParticle2D类?
class Particle extends VerletParticle2D {    Particle(Vec2D loc) {    super(loc); 调用super()函数,确保对象以正确的方式初始化}void display() { 我们只须要实现一个display()函数     fill(175);    stroke(0);    ellipse(x,y,16,16); 从VerletParticle类中继承了x坐标和y坐标  }}

  • 还记得Box2D示例步伐的处理处罚步骤吗?我们须要向Box2D物体对象扣问它的位置,再将坐标转换为像素坐标,末了根据转换后的坐标绘图。在这里,由于我们从VerletParticle2D类中继承了全部功能,剩下的使命只是根据x坐标和y坐标处绘制图形!
    顺便再提一点,VerletParticle2D类是Vec2D的子类,因此除了从VerletParticle2D继承的特性,我们的粒子类尚有Vec2D对象的全部功能。如今,我们可以在Sketch的恣意位置创建粒子对象。
Particle p1 = new Particle(new Vec2D(100,20))article p2 = new Particle(new Vec2D(100,180));

  • 仅仅创建一个粒子是不敷的,还应该用addParticle()函数将粒子对象添加到物理天下中。
physics.addParticle(p1);physics.addParticle(p2);

  • 从toxiclibs的文档中可以看到,addParticle()函数的参数是一个VerletParticle2D对象。
addParticle(VerletParticle2D particle);

  • 如安在addParticle()函数中传入本身的粒子对象?面向对象编程中有多态特性,由于Particle类继承自VerletParticle2D类,我们可以把这个粒子实例当作两种对象——Particle对象和VerletParticle2D对象。这是面向对象编程中一个很强盛的特性。假如自界说类都继承自toxiclibs的类,它们就可以直接将其用在toxiclibs物理库中。
2、弹簧

  除了VerletParticle类,toxiclibs还提供了一些毗连粒子的弹簧类。toxiclibs有3种范例的弹簧。

  • VerletSpring 
    该类在两个粒子之间创建毗连,包罗刚性毗连和弹性毗连。其
    中的某个粒子可以被固定,只有弹簧的另一端可以移动。
  • VerletConstrainedSpring 
    可以通过VerletConstrainedSpring对象限
    制毗连的最大长度,如许弹性体系具有较好的稳固性。
  • VerletMinDistanceSpring 
    VerletMinDistanceSpring对象可以包管物体之间的间隔不小于静止长度,假如你想让物体之间保持一定间隔,但不关心它们之间的最大间隔,可以使用这个类。
  前面提到的继承和多态技能同样实用于弹簧对象的创建,创建一个弹簧对象须要传入两个VerletParticle对象,由于我们的Particle类继承自VerletParticle对象,因此VerletSpring的构造函数也继承粒子对象作为参数。以下代码展示了如安在粒子对象p1和p2之间创建一个弹性毗连,该毗连有指定的静止长度和弹性强度。
float len = 80; 弹簧的静止长度float strength = 0.01; 弹簧的强度VerletSpring2D spring=new VerletSpring2D(p1,p2,len,strength);

  • 和粒子一样,为了让弹簧成为toxiclibs物理天下的一部门,我们须要在物理天下中添加这个对象。
physics.addSpring(spring);
您需要登录后才可以回帖 登录 | 立即注册

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

GMT+8, 2024-10-18 16:42, Processed in 0.151145 second(s), 32 queries.© 2003-2025 cbk Team.

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