Java contactListener不工作,如何实现它?
我试图实现beginContact contactlistener类的方法,但对此我有一些疑问。 我是libgdx新手,不知道如何“离开”控制联系人的方法。 在我的项目中,我有一个管理演员的舞台。 我在网上看了看,发现我必须添加世界。 但我不能理解这个概念,为什么:) 一些善良的灵魂能帮助我吗?多谢各位Java contactListener不工作,如何实现它?,java,android,libgdx,collision-detection,game-physics,Java,Android,Libgdx,Collision Detection,Game Physics,我试图实现beginContact contactlistener类的方法,但对此我有一些疑问。 我是libgdx新手,不知道如何“离开”控制联系人的方法。 在我的项目中,我有一个管理演员的舞台。 我在网上看了看,发现我必须添加世界。 但我不能理解这个概念,为什么:) 一些善良的灵魂能帮助我吗?多谢各位 public void create() { stage = new Stage(); Gdx.input.setInputProcessor(stage); wo
public void create() {
stage = new Stage();
Gdx.input.setInputProcessor(stage);
world = new World(new Vector2(0,-10), true);
world.setContactListener(contactlistener);
//meteora
meteora = new Image(new TextureRegion(new Texture(Gdx.files.internal("planet.png")), 128, 128));
meteora.setOrigin(meteora.getWidth() / 2, meteora.getHeight() / 2);
meteora.setPosition(Gdx.graphics.getWidth() / 2, 100);
meteora.setZIndex(3);
group = new Group();
group.addActor(spaceShip);
group.addActor(flagShip);
group.setZIndex(3);
group.setWidth(98);
group.setHeight(128);
group.setOrigin(group.getWidth() / 2, group.getHeight() / 2);
group.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);
stage.addActor(group);
stage.addActor(meteora);
}
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
/*....other code....*/
}
ContactListener contactlistener = new ContactListener() {
@Override
public void beginContact(Contact contact) {
final Fixture x1 = contact.getFixtureA();
final Fixture x2 = contact.getFixtureB();
System.out.println(x1.getUserData());
System.out.println(x2.getUserData());
if ( (x1.equals("gruppo") && x2.equals("planet")) || (x1.equals("planet") && x2.equals("gruppo")) )
System.out.println("shot");
}
@Override
public void endContact(Contact contact) {
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
};
问题是,
Actor
和子类是来自Scene2D
的类,Libgdx scenegraph,而World
和ContactListener
是表单Box2D
,一个物理引擎。Box2D
引擎不能与Actor
s一起工作,它需要Body
s和Fixture
s才能工作。因此,如果您想同时使用这两个概念,您需要创建一个
Box2DActor
,它在构造函数中创建一个主体
,并将其添加到物理世界中
在render(delta)
中,您需要使用step
方法更新World
,然后需要使用Body
s的位置更新Box2DActor
s的位置。
我建议您阅读libgdx wiki中的这些文章:
阅读维基的其余部分或至少是相关部分并不是一个坏主意。
我还建议从更简单的游戏开始,它不需要像Box2D
这样的物理引擎,就可以获得一些关于libgdx的基本知识。
从复杂的游戏开始只会让你感到沮丧,因为你将面临许多问题,其中许多问题将很难解决
编辑:
碰撞检测本身取决于您使用的形状。
如果对象是圆,则它们会发生碰撞,如果它们之间的距离小于半径之和。
对于矩形
s,可以使用重叠
方法。
Intersector
类也包含一些检测不同对象碰撞/重叠的方法。
管理是另一回事。如果你不需要太多太复杂的对象,我想把它们保存在一个列表中,然后在嵌套的for
循环中迭代,检查每个对象对就足够了。
一个小小的优化是在实际碰撞检查之前进行距离检查,因为在进行一些复杂的重叠检查之前,大多数对象都会被分拣出来。如果没有box2d,如何检测碰撞?有办法吗?我尝试了重叠,但对动态对象无效。