Java contactListener不工作,如何实现它?

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

我试图实现beginContact contactlistener类的方法,但对此我有一些疑问。 我是libgdx新手,不知道如何“离开”控制联系人的方法。 在我的项目中,我有一个管理演员的舞台。 我在网上看了看,发现我必须添加世界。 但我不能理解这个概念,为什么:)

一些善良的灵魂能帮助我吗?多谢各位

   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,如何检测碰撞?有办法吗?我尝试了重叠,但对动态对象无效。