libgdx-与由不同实体生成的对象的碰撞

libgdx-与由不同实体生成的对象的碰撞,libgdx,listener,box2d,collision-detection,Libgdx,Listener,Box2d,Collision Detection,嗨,我有一个物体,它是由几个物体组成的,它们之间的区别是,有人是过滤器,有人不是。 我希望我的演员在与物理面碰撞时被摧毁,在与传感器面碰撞时产生不同的效果。 那么,如果接触发生在一个部分或另一个部分,我如何在碰撞侦听器中进行检查 假设你有一张桌子和一群奶牛,你想确定是否有奶牛与桌子相撞 Body table; Array<Body> cows; //define the table and cows ContactListener listener = new ContactLi

嗨,我有一个物体,它是由几个物体组成的,它们之间的区别是,有人是过滤器,有人不是。 我希望我的演员在与物理面碰撞时被摧毁,在与传感器面碰撞时产生不同的效果。
那么,如果接触发生在一个部分或另一个部分,我如何在碰撞侦听器中进行检查

假设你有一张桌子和一群奶牛,你想确定是否有奶牛与桌子相撞

Body table;
Array<Body> cows;

//define the table and cows

ContactListener listener = new ContactListener() {

  @Override
  public void beginContact(Contact contact) {
    Body bodyA = contact.getFixtureA().getBody();
    Body bodyB = contact.getFixtureB().getBody();

    for (Body cow : cows) {
      if (((cow == bodyA) || (cow == bodyB)) &&
         ((table == bodyA) || (table == bodyB))) {
          //do something
      }
    }
  }
};
Body表;
阵列奶牛;
//定义表和表
ContactListener侦听器=新建ContactListener(){
@凌驾
public void beginContact(联系人){
Body bodyA=contact.getFixtureA().getBody();
Body bodyB=contact.getFixtureB().getBody();
用于(牛体:牛){
如果((cow==bodyA)| |(cow==bodyB))&&
((表==bodyA)| |(表==bodyB))){
//做点什么
}
}
}
};

这是一个通用的答案,但它告诉你如何检查哪些物体发生碰撞,我相信这回答了你的问题。

可能有很多方法可以做到这一点,但下面是我如何进行物理到游戏对象映射的过程。这不是我在宗教上坚持的东西,但我试着坚持——总是有例外

如果我有一个“游戏对象”,它有一个身体。用户数据已设置为该对象

如果我有一个由部分组成的“游戏对象”,这些部分就是“游戏对象部分”,它们将是身体固定装置的用户数据

我的“游戏对象”是“部件对象”的组合,就像身体有固定部件一样

如果你有这样的东西,那么你可以很容易地区分碰撞中物体的各个部分。如果你真的希望你的“游戏对象”因为其他原因由多个实体组成,那么我仍然会让“游戏对象”有“部分”,它们被设置为组成它的实体的用户数据。希望有帮助


我还更进一步——我的“游戏对象”有自己的碰撞处理程序集合。因此,我的单一注册冲突侦听器获取userdata对象,并使用相同的参数调用它们的冲突处理程序。利用多态性,伙计。现在我可以将给定对象的碰撞行为附加到该对象。我不必遍历所有对象来决定在已注册的冲突侦听器中执行什么操作。

这可能有助于我的联系人侦听器无法查看我的对象。这个项目是一个有多个关卡的游戏,我在任何关卡都创建了不同类型对象的新实例。我可以通过bodyA和bodyB检查哪个主体(来自碰撞类属性的主体)与其他参与者发生碰撞吗?到目前为止,我的技巧类似于“如果(类的bodyA.getUserata()instaceof ClassA&&bodyB.getUserData()instance of ClassB)”,但在这种情况下,仅仅作为类的实例是不够的,我现在需要知道它是否是该类的特定主体,只要在类的对象中提供一个getter方法,侦听器就可以访问该方法,该方法可以告诉侦听器主体是否可碰撞。类似于
bodyA.iscollidable()的东西您可以将主体强制转换为您的主体类<代码>MyBodyClass bodyA=(MyBodyClass)contact.getFictureA().getBody()扩展主体并添加getter方法的替代方法是使用
get[set]UserData()
设置并获取一个
boolean
,如果主体是可冲突的。我的类不扩展主体。它有三个类似于属性的实体,其中只有一个应该可以与其他副作用交叉,以便在Listener中实现。将用户数据设置为布尔值,判断实体是否可碰撞如何?简单到
body.setUserData(true)
body.setUserData(false)
然后
bodyA.getUserData()
将返回true或false。将getter转换为boolean,您应该会很高兴。我已经解决了我的问题,碰撞处理程序部分是一个好主意,但非常有用