Javascript Can';t在JS(box2d)处理中移除阀体
我使用的是Box2d和processing(JS),我有两个物体,我希望其中一个在碰撞时消失,我尝试使用“physics.removeBody(b1)”;但不幸的是,我的世界中所有的物体都消失了!这是碰撞函数中的代码Javascript Can';t在JS(box2d)处理中移除阀体,javascript,box2d,processing,physics,collision,Javascript,Box2d,Processing,Physics,Collision,我使用的是Box2d和processing(JS),我有两个物体,我希望其中一个在碰撞时消失,我尝试使用“physics.removeBody(b1)”;但不幸的是,我的世界中所有的物体都消失了!这是碰撞函数中的代码 void collision(Body b1, Body b2, float impulse) { if (b2 == basket && b1.getMass() > 0) { score += 10; pop.cue(0);
void collision(Body b1, Body b2, float impulse) {
if (b2 == basket && b1.getMass() > 0) {
score += 10;
pop.cue(0);
pop.play();
physics.removeBody(b1);
}
}
通常在创建实体时,我会执行以下操作:
void makeBody(float x, float y) {
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
bd.position.set(box2d.coordPixelsToWorld(x, y));
body = box2d.createBody(bd);
body.setUserData(this); // This is important
PolygonShape sd = new PolygonShape();
float box2dW = box2d.scalarPixelsToWorld(w/2);
float box2dH = box2d.scalarPixelsToWorld(h/2);
sd.setAsBox(box2dW, box2dH);
FixtureDef fd = new FixtureDef();
fd.setUserData("box");
// Attach Fixture to Body
body.createFixture(fd);
}
既然您的主体具有userData属性,您可以像这样测试碰撞:
void beginContact (Contact cp) {
// Get both fixtures
Fixture f1 = cp.getFixtureA();
Fixture f2 = cp.getFixtureB();
// Get both bodies
Body b1 = f1.getBody();
Body b2 = f2.getBody();
// Get our objects that reference these bodies
Object o1 = b1.getUserData();
Object o2 = b2.getUserData();
//Detect player-enemy collision
if (b1.getUserData() == "player" && b2.getUserData() == "enemy") {
//... Do stuff here
}
if (b2.getUserData() == "player" && b1.getUserData() == "enemy") {
//... Do stuff here
}
关键是使用主体的setUserData()函数指定唯一标识符,然后使用主体的getUserData()函数检查并确保对象碰撞是您想要的。在你的例子中,你有身体b1和身体b2,但不做任何类型的测试,以确保正确的身体碰撞
我希望这有帮助对碰撞()的调用如何?可能所有对象都满足if()中的条件……我遇到了类似的问题,通过将实体放在ArrayList中,然后在ArrayList发生冲突时从ArrayList中删除相关元素,解决了这个问题。有点笨重,但它能用。这可能与您的问题正交,但您是否也在测试“(b1==basket&&b2.getMass()>0)”呢?