Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Libgdx中创建多边形和矩形连接在一起的实体_Java_Libgdx_Polygon - Fatal编程技术网

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

Java 如何在Libgdx中创建多边形和矩形连接在一起的实体,java,libgdx,polygon,Java,Libgdx,Polygon,我是Libgdx的新手。我正在研究探测两个物体的碰撞。使用“多边形形状”创建了两个实体,但不幸的是,除了“矩形”之外,没有任何方法可以检测“多边形形状”之间的碰撞。因此,我想到了在每个多边形的前面附加矩形,然后检测矩形的碰撞,但当我运行代码时,我看不到任何矩形,只有多边形 这是我的密码 public class Player implements Screen, InputProcessor { private Body polybody; private Player player; pri

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

这是我的密码

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;
   }
  }
}
//第二机构

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

这是我的密码。我已经用“多边形形状”和“矩形”创建了两个实体,但没有创建矩形。我找不出是什么错误。请帮忙!!提前感谢

您似乎有点困惑,您正在混合两种完全独立的东西:

  • Box2D
    ,一种物理引擎,可以进行所有物理计算 (包括碰撞检测)为您准备
  • libgdx的
    矩形
    多边形
    交集
我试图解释它们都做什么以及为什么不能一起使用。
Polygonshape
Box2D
引擎的一部分。它用于给出一个
夹具
的形状,然后由
Box2D
的碰撞检测使用
您可以阅读有关
Box2D

Rectangle
类是Libgdx中的某种“Helperclass”,它允许您定义一个具有给定位置、宽度和高度的
Rectangle
。它可以与
Intersector
类一起使用,该类为碰撞检测和其他方面提供了一些有用的方法。
还有一个类caled
Polygon
。它也是一个Libgdx类,不能与
Box2D
PolygonShape
混合使用。Libgdx
Polygon
可以与
Intersector
类一起使用,该类提供了一种检查2个
Polygon
之间重叠的方法<代码>多边形s由一个
float[]
定义,给出其所有角点的位置。
这意味着,如果要使用物理引擎
Box2D
,则需要使用
PolygonShape
和其他由
Box2D
提供的形状
如果您不想使用物理引擎并自己进行碰撞检测,您可以使用
Libgdx
中的
矩形
多边形
和其他形状,也可以使用
交线
进行重叠测试

编辑:
如果你看一下,这里有一节“联系听众”。您可以看到,
ContactListener
提供了方法
beginContact
(当两个对象开始碰撞/重叠时调用)和
endContact
(当两个对象之间的接触结束时调用)。
您需要实现这些方法,并将其设置为
world
s
ContactListener

节点,Box2D通过分离碰撞对象(反弹)自动处理碰撞。如果这不是您想要的,您应该设置
FixtureDef
isSensor
-标志。这样,Box2D将通知您发生冲突(
beginContact
被调用),但不会为您处理

编辑2
您在
ContactListener
方法中获得的
Contact
对象包含2个
Fixture
s:
fixturea
FixtureB

这是因为在每次接触或碰撞中必须涉及两个对象,因此
FixtureA
是其中之一,而
FixtureB
是另一个。
一个
触点
包含2个
夹具
s而不是2个
主体
s的原因如下:
假设我们有一个
播放器
,由
主体
定义。这个
身体
包含两个
固定装置
s:
头部固定装置
,一个圆圈代表头部和
身体固定装置
,一个矩形,代表
玩家
身体和脚的点击框。
现在,如果一个
子弹
(一个
身体
,带有一个
夹具
)击中我们的
播放器
,如果它击中它的身体或头部,可能会产生不同。
因此基本上,
身体
代表我们的整个对象,
玩家
,而
夹具
代表它的一些部分,用于物理计算。

如果您只想处理每个
Body
的冲突,那么可以通过调用
fixtureA().getBody()

来获得
Body
,这似乎是在混合两种不同的东西:libgdxapi中的
Rectangle
和Box2D中的
Body
s<代码>矩形与Box2D physic引擎无关,因此它无法检测到与您的
矩形
的冲突。相反,您应该创建一个具有矩形形状的
夹具
,就像allready为
polyfixture
所做的那样。然后将此
夹具
添加到您的
enemyBody
中。当我检测到两个多边形形状之间的碰撞时,例如if(Intersector.overlapponspolygons(poly,poly),其中poly是“polygonshape”,poly也是“polygonshape”,如上所述,它会给我错误,就像方法overlapponsponspolygons(Polygon,Polygon)在类型中,Intersector不适用于参数(PolygonShape,PolygonShape)@SpringrbuaI添加了一个答案,希望能澄清这些问题。如果你使用Box2D,你不需要检测碰撞,Box2D会帮你检测碰撞。如何使用Box2D检测碰撞。@SpringrbuaI在我的答案中添加了一些信息。非常感谢你的指导。我刚刚了解了如何实现“联系人侦听器”但我不明白fixtureA和fixtureB到底做了什么,它是什么@Springrbua@Anusha添加了更多信息:)非常感谢,先生。我有
   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");
 }