如何在 Libgdx 中创建多边形和矩形连接在一起的 body

How to create a body with Polygon and Rectangle attached together in Libgdx

我是 Libgdx 的新手。我正在研究检测两个物体的碰撞。使用 "polygonshape" 创建了两个物体,但不幸的是,除了 "rectangles" 之外,没有任何方法可以检测 "PolygonShapes" 之间的碰撞。所以我想到了在前面附加矩形的想法每个多边形,然后检测矩形的碰撞,但是当我 运行 代码时,我没有看到任何矩形,只有多边形。

这是我的代码,

public class Player implements Screen, InputProcessor {

private Body polybody;
private Player player;
private World world;
Array<Rectangle> raindrops;

private Body enemybody;
private Sprite polysprite;
public final float width,height;
private Vector2 movement=new Vector2();
    private float speed=580;


    public Player(World world,float x,float y,float width)
    {
    this.width=width; //IMP
    height=width*2;
    BodyDef polygon=new BodyDef();
    polygon.type=BodyType.DynamicBody;
    polygon.position.set(x,y); //
    PolygonShape poly =new PolygonShape();
    poly.setAsBox(width/2,height/2); //
    FixtureDef polyfixture=new FixtureDef();
    polyfixture.shape=poly;

    polyfixture.friction=0.8f;  //
    polyfixture.restitution=0.1f; //
    polyfixture.density=3; //


   //creating actual body
    polybody=world.createBody(polygon);
    polybody.createFixture(polyfixture);

  //disposing the body
    BodyDef rectangle=new BodyDef();
    rectangle.type=BodyType.DynamicBody;
    Rectangle rect=new Rectangle();

    rect.setWidth(50);
    rect.setHeight(50);
    rect.setPosition(x, y);
    enemybody=world.createBody(rectangle);

    polysprite=new Sprite(new Texture("img/car.jpg"));
    polysprite.setSize(0.5f, 1); 
    polysprite.setOrigin(polysprite.getWidth()/2, polysprite.getHeight()/2);
    polybody.setUserData(polysprite);
    poly.dispose();   

   }

   public void update()
   {
      polybody.applyForceToCenter(movement, true);
      enemybody.applyForceToCenter(movement,true);

   }


  public Body getBody(){
   {
  return polybody;
   }
  }
}

碰撞代码:

 public Player(World world,float x,float y,float width)
 {
 this.width=width; //IMP
  height=width*2;
 BodyDef polygon=new BodyDef();
 polygon.type=BodyType.DynamicBody;
  polygon.position.set(x,y); //

 //   polygon.fixedRotation=true;
 //polygon shape
 //Rectangle poly=new Rectangle();
 PolygonShape poly =new PolygonShape();
 poly.setAsBox(width/2,height/2); //
 //fixture defn
 polygon.position.set(5,4);
 FixtureDef polyfixture=new FixtureDef();
 polyfixture.shape=poly;

 polyfixture.friction=0.8f;  //
  polyfixture.restitution=0.1f; //
 polyfixture.density=3; //


  //creating actual body
  polybody=world.createBody(polygon);
 polybody.createFixture(polyfixture);
 // polybody.applyAngularImpulse(52, true);
 //disposing the body

polysprite=new Sprite(new Texture("img/car.jpg"));

 polysprite.setSize(2, 3); //size of mario
polysprite.setOrigin(polysprite.getWidth()/2, polysprite.getHeight()/2);
 polybody.setUserData(polysprite);

//第二个body

   BodyDef polygons=new BodyDef();
 polygons.type=BodyType.DynamicBody;

 PolygonShape polys=new PolygonShape();
 polys.setAsBox(2,2);

FixtureDef polyxfixture=new FixtureDef();
polyxfixture.shape=polys;

polyxfixture.friction=0.8f;
polyxfixture.restitution=0.1f;
polyxfixture.density=3;


  polybodys=world.createBody(polygons);
  polybodys.createFixture(polyxfixture);

 poly.dispose();    

  }

   @Override
   public void beginContact(Contact contact) {
// TODO Auto-generated method stub
Fixture fixtureA=contact.getFixtureA();
Fixture fixtureB=contact.getFixtureB();
System.out.println("collides");
 }

这是我的代码。我使用 "polygonshape" 和 "rectangle" 创建了 2 个主体,但未创建矩形。我找不到什么是错误的。请帮忙!!提前致谢

看来您有点困惑,您正在混合两个绝对独立的事物:

  • Box2D,一个物理引擎,做所有的物理计算 (包括碰撞检测)为您服务。
  • RectanglePolygon和libgdx的Intersectorclass。

我试着解释一下它们的作用以及为什么不能一起使用它们。
PolygonshapeBox2D 引擎的一部分。它用于给出 Fixture 它的形状,然后用于 Box2D.
的碰撞检测 您可以阅读有关 Box2D here.
的内容 Rectangle class 是 Libgdx 中的某种 "Helperclass",它允许您定义具有给定位置、宽度和高度的 Rectangle。它可以与 Intersectorclass 一起使用,它提供了一些有用的碰撞检测和其他方法。
还有一个 class 叫做 Polygon。同样,它是 Libgdx class,不能与 Box2D PolygonShape 混合。 Libgdx Polygon 可以与 Intersector class 一起使用,它提供了一种检查 2 Polygon 之间重叠的方法。 Polygons 由 float[] 定义,给出了它所有角点的位置。
这意味着,如果您想使用物理引擎 Box2D,您需要使用 PolygonShape 和其他由 Box2D 提供的形状。
如果您不想使用物理引擎并自己进行碰撞检测,则可以使用 RectanglePolygonLibgdx 中的其他形状,您也可以使用Intersector 对于 overlap-testing.

编辑:
如果你看一下this link,有一个部分"Contact Listener"。在那里你可以看到,ContactListener 提供了方法 beginContact (当两个 object 开始到 collide/overlap 时调用)和 endContact (当两者之间的联系时调用两个 objects 结束)。
您需要实现这些方法并将其设置为 worlds ContactListener.
节点,Box2D 通过分离碰撞 objects(反弹)自动处理碰撞。如果那不是你想要的,你应该设置你的 FixtureDefisSensor-Flag。这样,Box2D 会通知您发生碰撞(beginContact 被调用)但不会为您处理。

编辑 2:
您在 ContactListener-Methods 中获得的 Contact object 包含 2 Fixtures:FixtrueAFixtureB.
那是因为在每次接触或碰撞中都必须涉及 2 object,所以 FixtureA 是其中之一,FixtureB 是另一个。
Contact 包含 2 个 Fixture 而不是 2 个 Body 的原因如下:
假设我们有一个 Player,由 Body 定义。这个 Body 包含 2 Fixtures:headFixture,一个圆圈代表它的头部和 bodyFixture,一个矩形,代表 Players [=113] 的 hitbox =] 和脚。
现在,如果一个 Bullet(一个 Body 和一个 Fixture)击中了我们的 Player,如果它击中了它的 body 或它的头,它可能会有所不同.
所以基本上 Body 抑制我们整个 object,Player,而 Fixtures 抑制它的某些部分,用于 physics-calculation.
如果你只想处理每个 Body 的碰撞,你可以通过调用 fixtureA().getBody().

来获得 Body