【问题标题】:contactListener does not work , how to implement it?contactListener 不起作用,如何实现呢?
【发布时间】:2015-03-25 21:43:41
【问题描述】:

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

有好心人能帮帮我吗?谢谢你

   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) {

    }
};

【问题讨论】:

    标签: java android libgdx collision-detection game-physics


    【解决方案1】:

    问题是,Actor 和子类是来自 Scene2D(Libgdx 场景图)的类,而 WorldContactListener 是来自 Box2D 的物理引擎。
    Box2D 引擎不能与Actors 一起工作,它需要Bodys 和Fixtures 才能工作。
    所以如果你想同时使用这两个概念,你需要创建一个Box2DActor,它在它的构造函数中创建一个Body,并将它添加到物理World
    在您的render(delta) 中,您需要使用step 方法更新World,然后您需要使用Bodys 的位置更新Box2DActors 的位置。
    我建议您阅读 libgdx wiki 中的这些文章:

    阅读 wiki 的其余部分或至少阅读相关部分并不是一个坏主意。
    另外我建议从更简单的游戏开始,它不需要像Box2D 这样的物理引擎,以获得一些 libgdx 的基本知识。
    从复杂的游戏开始只会让您感到沮丧,因为您将面临许多问题,其中许多问题将难以解决。

    编辑:
    碰撞检测本身取决于您使用的形状。
    如果您的对象是圆形,那么它们会发生碰撞,如果它们之间的距离小于它们的半径之和。
    对于Rectangles,您可以使用overlaps 方法。
    Intersector 类还包含一些方法来检测不同对象的碰撞/重叠。
    管理是另一回事。如果您不需要很多复杂的对象,我想将它们保存在一个列表中并在嵌套的for 循环中遍历它就足够了,检查每个对象对。
    一些优化是在实际碰撞检查之前进行距离检查,因为在进行一些复杂的重叠检查之前,大多数对象都会被整理出来。

    【讨论】:

    • 如何在没有 box2d 的情况下检测碰撞?有办法吗?我尝试了重叠并且它可以工作,但是对于动态对象它不起作用。
    猜你喜欢
    • 2021-05-12
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2022-08-16
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多