js css html

碰撞事件

2022-06-11  本文已影响0人  大龙10

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

5.13 碰撞事件

1、Box2D的另一个特性——碰撞

  Box2D通过“接口”提醒碰撞事件发生的时刻,在这里,我们有必要学习接口的相关知识,这是面向对象编程的一项高级特性。

你可以查看Java接口教程
(http://download.oracle.com/javase/tutorial/java/concepts/interface.html)
和JBox2DContactListener类的文档。

2、PBox2D的碰撞

3、beginContact()函数的使用方式

void beginContact(Contact cp) {
}

步骤1:

Contact对象,你能否告诉我哪两个物体发生了碰撞

Fixture f1 = cp.getFixtureA(); Contact对象存放了发生碰撞的夹具A和夹具B
Fixture f2 = cp.getFixtureB();

步骤2:

夹具对象,你能否告诉我你连接在哪个物体上

Body b1 = f1.getBody(); getBody()函数告诉我们夹具连在哪个物体上
Body b2 = f2.getBody();

步骤3:

物体,你能否告诉我你连接在哪个粒子对象上

class Particle {
    Body body;
    Particle(float x, float y, float r) {
        BodyDef bd = new BodyDef();
        bd.position = box2d.coordPixelsToWorld(x, y);
        bd.type = BodyType.DYNAMIC;
        body = box2d.createBody(bd);
        CircleShape cs = new CircleShape();
        cs.m_radius = box2d.scalarPixelsToWorld(r);
        body.createFixture(fd,1);
        body.setUserData(this); “this”指当前的粒子对象,我们让Box2D对象存放这个粒子对象
      }
  }

在addContact()函数中,一旦我们知道了碰撞的物体,就可以通过getUserData()函数获取物体对应的粒子对象。

4、示例代码5-9 碰撞监听

void beginContact(Contact cp) {
    Fixture f1 = cp.getFixtureA();
    Fixture f2 = cp.getFixtureB();
    Body b1 = f1.getBody();
    Body b2 = f2.getBody();
    Particle p1 = (Particle)b1.getUserData(); 当我们从“用户数据”对象中抽取物体对象时,需
    Particle p2 = (Particle)b2.getUserData();
    p1.change(); 一旦有了粒子对象,我们就可以对它做任何事情。在这里,我们调用change函数,改变
    p2.change();
}
Object o1 = b1.getUserData(); 获取一个泛型对象
if (o1.getClass() == Particle.class) {
    Particle p = (Particle) o1; 询问对象是否为Particle
    p.change();
}

5、运行结果

上一篇 下一篇

猜你喜欢

热点阅读