书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
5.13 碰撞事件
Box2D通过“接口”提醒碰撞事件发生的时刻,在这里,我们有必要学习接口的相关知识,这是面向对象编程的一项高级特性。
你可以查看Java接口教程
(http://download.oracle.com/javase/tutorial/java/concepts/interface.html)
和JBox2DContactListener类的文档。
void beginContact(Contact cp) {
}
Contact对象,你能否告诉我哪两个物体发生了碰撞
Fixture f1 = cp.getFixtureA(); Contact对象存放了发生碰撞的夹具A和夹具B
Fixture f2 = cp.getFixtureB();
夹具对象,你能否告诉我你连接在哪个物体上
Body b1 = f1.getBody(); getBody()函数告诉我们夹具连在哪个物体上
Body b2 = f2.getBody();
物体,你能否告诉我你连接在哪个粒子对象上
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()函数获取物体对应的粒子对象。
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();
}