碰撞后如何使两个身体粘住?
我真的坚持这个我能成功地发现碰撞,但是我不能让两个身体参与碰撞。
这是我的ContactListener
world.setContactListener(listener); listener = new ContactListener() { @Override public void preSolve(Contact contact, Manifold oldManifold) { } @Override public void postSolve(Contact contact, ContactImpulse impulse) { } //called when two fixtures cease to touch @Override public void endContact(Contact contact) { Fixture fixtureA = contact.getFixtureA(); Fixture fixtureB = contact.getFixtureB(); Gdx.app.log("beginContact", "between" + fixtureA.toString() + "and" + fixtureB.toString()); } //called when two fixtures begin to touch @Override public void beginContact(Contact contact) { Fixture fixtureA = contact.getFixtureA(); Fixture fixtureB = contact.getFixtureB(); Gdx.app.log("beginContact", "between" + fixtureA.toString() + "and" + fixtureB.toString()); } };
这也是我在world.step()行之后直接放入render()的内容
int numContacts = world.getContactCount(); if(numContacts > 0) { Gdx.app.log("contact", "start of contact list"); for(Contact contact: world.getContactList()) { Fixture fixtureA = contact.getFixtureA(); Fixture fixtureB = contact.getFixtureB(); Gdx.app.log("contact", "between" + fixtureA.toString() + "and" + fixtureB.toString()); } Gdx.app.log("contact", "end of contact list"); }
我极度坚持在解决后解决或预先解决的问题真的很困惑。 我跟着iforce2d粘性射弹http://www.iforce2d.net/b2dtut/sticky-projectiles,但是我不懂C ++,在eclipse中工作时会遇到很多语法错误。 请有人给我看一个工作碰撞的示例代码,在java中碰撞之后,身体会粘在一起。
这是使用libgdx包装器创建WeldJoint的方法:
WeldJointDef wd = new WeldJointDef(); wd.bodyA = body1; wd.bodyB = body2; wd.referenceAngle = wd.bodyB.getAngle() - wd.bodyA.getAngle(); world.createJoint( wd );
不要尝试在ContactListener中创建Joints。 将要粘合的实体添加到列表中,并在world.step之后检查它们。
编辑:
好的,就像在iforce2d教程中一样 ,创建一个包含2个实体的对象:
public class StickyInfo{ Body bodyA; Body bodyB; public StickyInfo(Body bodyA, Body bodyB){ this.bodyA = bodyA; this.bodyB = bodyB; } };
然后创建一个StickyInfo的libgdx数组
Array collisionsToMakeSticky = new Array ();
当身体碰撞时(好吧,技术上他们的固定装置),将它们添加到此列表中:
collisionsToMakeSticky.add(new StickyInfo(body1, body2))
然后就在world.step之后,如果Array不为空。 创建WeldJoints:
while(collisionsToMakeSticky.size>0){ StickyInfo si = collisionsToMakeSticky.removeIndex(0); //Make the WeldJoint with the bodies si.bodyA and si.bodyB }