gpt4 book ai didi

java - Box2D 库 - 为什么当动态物体卡在静态物体和另一个动态物体之间时碰撞不能正常工作?

转载 作者:行者123 更新时间:2023-11-28 02:10:56 25 4
gpt4 key购买 nike

例如,一个动态的物体在一个角落里,并且正在无限地走向那个角落里的墙壁(需要是一个静态的物体)。如果另一个物体正朝同一个方向行走,并与第一个物体发生碰撞,则碰撞将被完全忽略。这是唯一会发生这种情况的情况。

下面是照片: enter image description here

到下一个世界步时,绿色矩形与红色球重叠。如果没有静态物体,碰撞会正常进行。

提前致谢。

最佳答案

它是Box2D特有的。如果一个动态物体垂直向另一个动态物体移动,并且在它们的路径上有一个静态物体,动态物体无论如何都会相互重叠。要修复这个bug,可以使用contact listener来捕捉body碰撞的瞬间,直接根据red body的位置设置green body的位置。类似的东西:

public class CoreClass extends Game {


Array<Body> bodies = new Array<Body>();
World world = new World(new Vector2(0.0f, 0.0f), true);

Body bodyRed;
Body bodyGreen;
private float prevX;
private float prevY;

@Override
public void create() {
BodyDef bodyBD = new BodyDef();
bodyBD.type = BodyType.DynamicBody;

FixtureDef bodyFD = new FixtureDef();
bodyFD.density = 1.0f;
bodyFD.friction = 1.0f;
bodyFD.restitution = 1.0f;

bodyRed = world.createBody(bodyBD);
bodyGreen = world.createBody(bodyBD);

bodyRed.createFixture(bodyFD);
bodyGreen.createFixture(bodyFD);

prevX = bodyGreen.getPosition().x; prevY = bodyGreen.getPosition().y;

world.setContactListener(new ContactListener() {

@Override
public void beginContact(Contact contact) {
world.getBodies(bodies);
bodies.get(contact.getChildIndexA()).getPosition().set(prevX, prevY);
}

@Override
public void endContact(Contact contact) {

}

@Override
public void preSolve(Contact contact, Manifold oldManifold) {

}

@Override
public void postSolve(Contact contact, ContactImpulse impulse) {

}

});
}

@Override
public void render() {
super.render();
prevX = bodyGreen.getPosition().x;
prevY = bodyGreen.getPosition().y;
world.step(1/45f, 2, 6);
}

关于java - Box2D 库 - 为什么当动态物体卡在静态物体和另一个动态物体之间时碰撞不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com