如何在 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
,一个物理引擎,做所有的物理计算
(包括碰撞检测)为您服务。
Rectangle
、Polygon
和libgdx的Intersector
class。
我试着解释一下它们的作用以及为什么不能一起使用它们。
Polygonshape
是 Box2D
引擎的一部分。它用于给出 Fixture
它的形状,然后用于 Box2D
.
的碰撞检测
您可以阅读有关 Box2D
here.
的内容
Rectangle
class 是 Libgdx 中的某种 "Helperclass",它允许您定义具有给定位置、宽度和高度的 Rectangle
。它可以与 Intersector
class 一起使用,它提供了一些有用的碰撞检测和其他方法。
还有一个 class 叫做 Polygon
。同样,它是 Libgdx class,不能与 Box2D
PolygonShape
混合。 Libgdx Polygon
可以与 Intersector
class 一起使用,它提供了一种检查 2 Polygon
之间重叠的方法。 Polygon
s 由 float[]
定义,给出了它所有角点的位置。
这意味着,如果您想使用物理引擎 Box2D
,您需要使用 PolygonShape
和其他由 Box2D
提供的形状。
如果您不想使用物理引擎并自己进行碰撞检测,则可以使用 Rectangle
、Polygon
和 Libgdx
中的其他形状,您也可以使用Intersector
对于 overlap-testing.
编辑:
如果你看一下this link,有一个部分"Contact Listener"。在那里你可以看到,ContactListener
提供了方法 beginContact
(当两个 object 开始到 collide/overlap 时调用)和 endContact
(当两者之间的联系时调用两个 objects 结束)。
您需要实现这些方法并将其设置为 world
s ContactListener
.
节点,Box2D 通过分离碰撞 objects(反弹)自动处理碰撞。如果那不是你想要的,你应该设置你的 FixtureDef
的 isSensor
-Flag。这样,Box2D 会通知您发生碰撞(beginContact
被调用)但不会为您处理。
编辑 2:
您在 ContactListener
-Methods 中获得的 Contact
object 包含 2 Fixture
s:FixtrueA
和 FixtureB
.
那是因为在每次接触或碰撞中都必须涉及 2 object,所以 FixtureA
是其中之一,FixtureB
是另一个。
Contact
包含 2 个 Fixture
而不是 2 个 Body
的原因如下:
假设我们有一个 Player
,由 Body
定义。这个 Body
包含 2 Fixture
s:headFixture
,一个圆圈代表它的头部和 bodyFixture
,一个矩形,代表 Player
s [=113] 的 hitbox =] 和脚。
现在,如果一个 Bullet
(一个 Body
和一个 Fixture
)击中了我们的 Player
,如果它击中了它的 body 或它的头,它可能会有所不同.
所以基本上 Body
抑制我们整个 object,Player
,而 Fixture
s 抑制它的某些部分,用于 physics-calculation.
如果你只想处理每个 Body
的碰撞,你可以通过调用 fixtureA().getBody()
.
来获得 Body
我是 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
,一个物理引擎,做所有的物理计算 (包括碰撞检测)为您服务。Rectangle
、Polygon
和libgdx的Intersector
class。
我试着解释一下它们的作用以及为什么不能一起使用它们。
Polygonshape
是 Box2D
引擎的一部分。它用于给出 Fixture
它的形状,然后用于 Box2D
.
的碰撞检测
您可以阅读有关 Box2D
here.
的内容
Rectangle
class 是 Libgdx 中的某种 "Helperclass",它允许您定义具有给定位置、宽度和高度的 Rectangle
。它可以与 Intersector
class 一起使用,它提供了一些有用的碰撞检测和其他方法。
还有一个 class 叫做 Polygon
。同样,它是 Libgdx class,不能与 Box2D
PolygonShape
混合。 Libgdx Polygon
可以与 Intersector
class 一起使用,它提供了一种检查 2 Polygon
之间重叠的方法。 Polygon
s 由 float[]
定义,给出了它所有角点的位置。
这意味着,如果您想使用物理引擎 Box2D
,您需要使用 PolygonShape
和其他由 Box2D
提供的形状。
如果您不想使用物理引擎并自己进行碰撞检测,则可以使用 Rectangle
、Polygon
和 Libgdx
中的其他形状,您也可以使用Intersector
对于 overlap-testing.
编辑:
如果你看一下this link,有一个部分"Contact Listener"。在那里你可以看到,ContactListener
提供了方法 beginContact
(当两个 object 开始到 collide/overlap 时调用)和 endContact
(当两者之间的联系时调用两个 objects 结束)。
您需要实现这些方法并将其设置为 world
s ContactListener
.
节点,Box2D 通过分离碰撞 objects(反弹)自动处理碰撞。如果那不是你想要的,你应该设置你的 FixtureDef
的 isSensor
-Flag。这样,Box2D 会通知您发生碰撞(beginContact
被调用)但不会为您处理。
编辑 2:
您在 ContactListener
-Methods 中获得的 Contact
object 包含 2 Fixture
s:FixtrueA
和 FixtureB
.
那是因为在每次接触或碰撞中都必须涉及 2 object,所以 FixtureA
是其中之一,FixtureB
是另一个。
Contact
包含 2 个 Fixture
而不是 2 个 Body
的原因如下:
假设我们有一个 Player
,由 Body
定义。这个 Body
包含 2 Fixture
s:headFixture
,一个圆圈代表它的头部和 bodyFixture
,一个矩形,代表 Player
s [=113] 的 hitbox =] 和脚。
现在,如果一个 Bullet
(一个 Body
和一个 Fixture
)击中了我们的 Player
,如果它击中了它的 body 或它的头,它可能会有所不同.
所以基本上 Body
抑制我们整个 object,Player
,而 Fixture
s 抑制它的某些部分,用于 physics-calculation.
如果你只想处理每个 Body
的碰撞,你可以通过调用 fixtureA().getBody()
.
Body