如何检测一个点是否在libgdx中与body相交

时间:2012-08-22 10:39:22

标签: java box2d libgdx

我正在向libgdx中的box2d世界添加带有灯具的实体。 我想检测用户是否触摸(点击)了一个对象。 我该怎么做呢?感谢

2 个答案:

答案 0 :(得分:7)

你应该使用libgdx Stage来检测Actors上的触摸事件(你在这里将它们称为对象)。最好的做法是将box2d主体映射到舞台演员,这样做很简单。

检测触摸:

实现InputProcessor接口的touchDown方法,以便:

  • 您必须使用stage.toStageCoordiantes(...)方法将屏幕坐标转换为舞台坐标。
  • 使用已转换的坐标使用stage.hit(x,y)检测舞台上的Actor(对象)上的点击。
  • 如果检测到命中,
  • stage.hit(x,y)将返回演员。

希望有所帮助。

答案 1 :(得分:1)

只有当用户接触到本身所包含的Fixture部分内容时,才会触摸身体。这意味着,您可以使用Fixture方法检查Body的每个testPoit()

public class Player {
    private Body _body;

    public boolean isPointOnPlayer(float x, float y){
        for(Fixture fixture : _body.getFixtureList())
            if(fixture.testPoint(x, y)) return true;
        return false;
    }
}

接下来,您需要像这样创建InputAdapter

public class PlayerControl extends InputAdapter {
    private final Camera _camera;
    private final Player _player;
    private final Vector3 _touchPosition;

    public PlayerControl(Camera camera, Player player) {
        _camera = camera;
        _player = player;
        // create buffer vector to make garbage collector happy
        _touchPosition = new Vector3();
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        // don't forget to unproject screen coordinates to game world
        _camera.unproject(_touchPosition.set(screenX, screenY, 0F));
        if (_player.isPointOnPlayer(_touchPosition.x, _touchPosition.y)) {
            // touch on the player body. Do some stuff like player jumping
            _player.jump();
            return true;
        } else
            return super.touchDown(screenX, screenY, pointer, button);
    }
}

最后一个 - 设置此处理器来监听用户输入:

public class MyGame extends ApplicationAdapter {

    @Override
    public void create () {
    // prepare player and game camera
    Gdx.input.setInputProcessor(new PlayerControl(cam, player));
}

详细了解触摸处理here

相关问题