Libgdx获取缩放后的触摸位置

10

我正在使用LIBGDX制作安卓游戏。

@Override
public boolean touchDown(int x, int y, int pointer, int button) {
    // TODO Auto-generated method stub

    return false;
}

这里,x和y返回设备屏幕触摸的位置,其值介于0和设备屏幕宽高之间。

我的游戏分辨率为800x480,并将在每台设备上保持其纵横比例。 我想找到一种方法来获取与游戏矩形相关的触摸位置,以下图片可以准确地解释: enter image description here

是否有方法可以实现? 我想获得与我的视口相关的触摸位置。 我使用以下内容来保持其纵横比例 http://www.java-gaming.org/index.php?topic=25685.0

3个回答

13

将您的触摸投影出来。

为用户触摸创建一个Vector3对象:

Vector3 touch = new Vector3();

使用相机将屏幕触摸坐标转换为相机坐标:

@Override
public boolean touchDown(int x, int y, int pointer, int button){

    camera.unproject(touch.set(x, y, 0)); //<---

    //use touch.x and touch.y as your new touch point

    return false;
}

我需要对所有的触摸事件进行反投影吗?我只在“轻触”功能中实现了它,但是在“平移”功能中没有。到目前为止似乎可以工作,但是“平移”有时会“跳动”,这可能是由于没有对“平移”功能进行反投影引起的吗? - Robin Ellerkmann

8
在较新版本的LibGDX中,您可以使用内置视口来实现此目的。首先选择您喜欢的视口,这里您需要的是FitViewport。您可以在此处阅读有关它们的信息:https://github.com/libgdx/libgdx/wiki/Viewports
接下来,声明并初始化视口,并传递您的分辨率和相机:
viewport = new FitViewport(800, 480, cam);

然后,请将您屏幕类的“resize”方法编辑为以下方式:
@Override
public void resize(int width, int height) {
    viewport.update(width, height);

}

现在,无论您想要在哪个位置获得触摸点,都需要根据新的分辨率将它们转移到新的点。幸运的是,viewport类会自动完成此操作。

只需编写以下内容:

Vector2 newPoints = new Vector2(x,y);
newPoints = game.mmScreen.viewport.unproject(newPoints);

在屏幕上,x和y是触摸点的位置,第二行代码中,“newPoints”获取了转换后的坐标。
现在,您可以将它们传递到任何您想要的地方。


注意了,我正在调用viewport.getCamera().unproject..这是不正确的。你必须在viewport本身上调用unproject,而不是在viewport相机上调用。谢谢。 - Lampione

0

经过1-2个痛苦的小时,我终于找到了解决方案...

if (Gdx.input.isTouched()) {
        float x = Gdx.input.getX();
        float y = Gdx.input.getY();
        float yR = viewport.height / (y - viewport.y); // the y ratio
        y = 480 / yR;

        float xR = viewport.width / (x - viewport.x); // the x ratio
        x = 800 / xR;

        bubbles.add(new Bubble(x, 480 - y));

    }

编辑:这是一种旧的过时做法,不要使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接