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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查两个Box2d机构是否在任何时刻发生碰撞/重叠?相关的知识,希望对你有一定的参考价值。

如何检查2个物体(两个夹具)是否碰撞(重叠)?

我知道ContactListener在它们开始碰撞时和停止时触发方法。但有没有办法在任何特定时刻检查它?喜欢:

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

其他细节,其中之一是传感器。这是在libgdx中。

答案

您可以将setContactlistner应用于您的世界对象

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()方法将是调用。

希望这可以帮助。

另一答案

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

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

         break;
     }
}
另一答案

您可以创建变量碰撞:当等于0时,collision等于false;当等于1时,碰撞等于真;

所以:

if(body1.overlaps(body2)==true)
{collision=1}
else
{collision=0}

以上是关于如何检查两个Box2d机构是否在任何时刻发生碰撞/重叠?的主要内容,如果未能解决你的问题,请参考以下文章

边缘 - Cocos2d/Box2D

空间中两个 3D 磁盘之间的碰撞检测

检查在任何地方的检查应用程序中都提出问题

如何检查我的播放器是否与对象发生碰撞?

检查元素索引是不是在二维数组内(用于在任何方向移动一)

Box2d Cocos2d 中的联系监听器