如何检查两个Box2d物体是否在任何时刻发生了碰撞/重叠?

9

如何检查两个带有一个 Fixture 的物体是否发生碰撞(重叠)?

我知道可以使用 ContactListener,当它们开始碰撞和停止碰撞时会触发一个方法。但是有没有一种方法在任何给定的时刻检查它们是否发生碰撞?例如:

if(body1.overlaps(body2))...

附加细节之一是传感器。这在libgdx中。


相关:https://dev59.com/smgu5IYBdhLWcg3wzKEc 完全在另一个物体内部:https://gamedev.stackexchange.com/questions/27320/in-box2d-how-can-i-check-for-bodies-within-a-circle - Ciro Santilli OurBigBook.com
3个回答

5

您可以将 setContactlistener 应用于您的世界对象,如下:

world.setContactListener(new ContactListener() {

            @Override
        public void beginContact(Contact contact) {

         if(contact.getfixtureA.getBody().getUserData()=="body1"&&
               contact.getfixtureB.getBody().getUserData()=="body2")
            Colliding = true;
            System.out.println("Contact detected");
        }

        @Override
        public void endContact(Contact contact) {
            Colliding = false;
            System.out.println("Contact removed");
        }

        @Override
        public void postSolve(Contact arg0, ContactImpulse arg1) {
            // TODO Auto-generated method stub
        }

        @Override
        public void preSolve(Contact arg0, Manifold arg1) {
            // TODO Auto-generated method stub
        }
    });
beginContact()方法在任何物体重叠或接触其他物体时都会调用。您还可以通过contact对象获取有关物体的信息,例如contact.getFixtureA().getBody().getUserData(),如果您想对它们进行一些操作。当它们相互分离时,将调用EndContact()方法。希望这有所帮助。

1
你没有理解/阅读我的问题,我知道关于ContactListener。 - Daahrien
正如我所说,您可以获取正在发生碰撞的物体的用户数据,因此借助这两个物体的用户数据,您可以获取一个布尔值或其他内容,并在渲染中检查该布尔值是否为真,如果是,则执行您的工作。并在endContact()方法中将其设置为false。 - Jagdeep Singh
我不知道目前是否存在这个错误,但是endContact并不总是触发。 - Oliver Dixon

2

只需检查您要查找的联系人是否在联系人列表中:

for (ContactEdge ce = body1.getContactList(); ce != null; ce = ce.next)
{
     if (ce.other == body2 && ce.contact.isTouching())
     {
         // Do what you want here

         break;
     }
}

1
不要忘记检查接触是否发生:ce->contact->IsTouching()。仅当AABB重叠时才创建联系。 - Pavel
1
虽然我给libgdx打了标签,但是我忘记告诉你了。它在libgdx中,而且身体中没有getContactList或其他方法。 - Daahrien

-4
你可以创建变量collision: 当等于0时,collision为false; 当等于1时,collision为true;
所以:
if(body1.overlaps(body2)==true)
{collision=1}
else
{collision=0}

你甚至都没有理解问题。 - Daahrien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接