【问题标题】:How to create a body with Polygon and Rectangle attached together in Libgdx如何在 Libgdx 中创建一个将多边形和矩形连接在一起的身体
【发布时间】:2015-03-03 15:41:11
【问题描述】:

我是 Libgdx 的新手。我正在检测两个物体的碰撞。使用“polygonshape”创建了两个实体,但不幸的是,没有任何方法可以检测“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);

//第二个身体

   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");
 }

这是我的代码。我使用“多边形”和“矩形”创建了 2 个实体,但没有创建矩形。我找不到是什么错误。请帮忙!!提前致谢

【问题讨论】:

  • 您似乎在混合两种不同的东西:来自 libgdx API 的 Rectangle 和来自 Box2D 的 Bodys。 Rectangle 与 Box2D 物理引擎无关,因此它无法检测到与您的 Rectangle 的碰撞。相反,您应该创建一个类似矩形的Fixture,就像您已经为polyfixture 所做的那样。然后将此Fixture 添加到您的enemyBody
  • 当我检测到两个多边形形状之间的碰撞,如 if(Intersector.overlapConvexPolygons(poly,polys) 其中 poly 是“polygonshape”,polys 也是“polygonshape”,如上所述,它给了我类似 The method overlayConvexPolygons (Polygon, Polygon) 类型中的 Intersector 不适用于参数 (PolygonShape, PolygonShape) @Springrbua
  • 我添加了一个答案,希望能解决这些问题。如果您使用 Box2D,则不需要检测碰撞,box2D 会为您完成这项工作。
  • 如何使用 box2D 检测碰撞。 @Springrbua
  • 我在回答中添加了一些信息。

标签: java libgdx polygon


【解决方案1】:

看起来你有点困惑,你正在混合两个绝对独立的东西:

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

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

编辑:
如果您查看this link,则有一个“联系听众”部分。在那里你可以看到,ContactListener 提供了方法beginContact(当两个对象开始碰撞/重叠时调用)和endContact(当两个对象之间的接触结束时调用)。
您需要实现这些方法并将其设置为 worlds ContactListener
节点,Box2D 通过分离碰撞对象(反弹)自动处理碰撞。如果这不是你想要的,你应该设置你的FixtureDefisSensor-Flag。这样一来,Box2D 会通知您发生碰撞(beginContact 被调用)但不会为您处理。

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

【讨论】:

  • 非常感谢您的指导。我只是在这个link 中查看了如何实现“联系侦听器”,但我不明白fixtureA 和fixtureB 实际做了什么以及@Springrbua 是什么
  • @Anusha 添加了更多信息 :)
  • 非常感谢先生。我已经创建了 2 个主体并测试了它是否会发生碰撞,但我没有看到任何变化,而且我不确定我所做的关于contactlistener 的操作是否正确。FixtureA 是第一个主体的固定装置,而 FixtureB 是第二个主体的固定装置吗? @Springrbua
  • @Anusha 完全正确。例如,当PlayerBullet 碰撞时,FixtureA 将是Player(或Bullet)的Fixture 和另一个FixtureBFixture @。你可以使用FixtureBodyUserData来检测,哪个BodyPlayer,哪个是Bullet
  • 好吧,先生,我仍然让身体移动并与另一个身体发生碰撞并使用 println 语句进行检查,但身体没有碰撞@Springrbua
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
相关资源
最近更新 更多