Java 如何在Libgdx中创建多边形和矩形连接在一起的实体
我是Libgdx的新手。我正在研究探测两个物体的碰撞。使用“多边形形状”创建了两个实体,但不幸的是,除了“矩形”之外,没有任何方法可以检测“多边形形状”之间的碰撞。因此,我想到了在每个多边形的前面附加矩形,然后检测矩形的碰撞,但当我运行代码时,我看不到任何矩形,只有多边形 这是我的密码Java 如何在Libgdx中创建多边形和矩形连接在一起的实体,java,libgdx,polygon,Java,Libgdx,Polygon,我是Libgdx的新手。我正在研究探测两个物体的碰撞。使用“多边形形状”创建了两个实体,但不幸的是,除了“矩形”之外,没有任何方法可以检测“多边形形状”之间的碰撞。因此,我想到了在每个多边形的前面附加矩形,然后检测矩形的碰撞,但当我运行代码时,我看不到任何矩形,只有多边形 这是我的密码 public class Player implements Screen, InputProcessor { private Body polybody; private Player player; pri
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
混合使用。LibgdxPolygon
可以与Intersector
类一起使用,该类提供了一种检查2个Polygon
之间重叠的方法<代码>多边形s由一个float[]
定义,给出其所有角点的位置。这意味着,如果要使用物理引擎
Box2D
,则需要使用PolygonShape
和其他由Box2D
提供的形状如果您不想使用物理引擎并自己进行碰撞检测,您可以使用
Libgdx
中的矩形
、多边形
和其他形状,也可以使用交线
进行重叠测试
编辑:如果你看一下,这里有一节“联系听众”。您可以看到,
ContactListener
提供了方法beginContact
(当两个对象开始碰撞/重叠时调用)和endContact
(当两个对象之间的接触结束时调用)。您需要实现这些方法,并将其设置为
world
sContactListener
节点,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");
}