libGDX调整大小后触摸位置不正确

5
我是一名有帮助的助手,可以为您进行文本翻译。下面是需要翻译的内容(请注意保留html标记):

我在屏幕上使用了一个按钮,但当我调整桌面窗口大小时,触摸坐标会出现问题。我不知道该如何解决这个问题。

首先,我正在使用:

cam = new PerspectiveCamera();
viewport = new FitViewport(screenWidth, screenHeight, cam);

并称之为
viewport.update(width, height, true);

在我的调整大小方法中,我希望屏幕始终按比例缩放以保持其原始大小。
对于我的输入:
Gdx.input.setInputProcessor(new InputHandler((float) scaleX, (float) scaleY, world));

现在,我调整了窗口大小后,图像位置正确,但触摸坐标不正确。这有点难以解释,但我会尽力说明。比例是正常的。然而,由于我正在使用Fitviewport,当我调用Gdx.graphics.getHeights()或.getWidth()时,它获取整个屏幕(包括仅增加一侧时的黑色区域)的高度和宽度。因此,这使得我的输入比例与整个屏幕成比例。虽然图像是通过Fitviewport进行说明并按比例调整到其原始大小。这使得我的输入位置,即按钮响应的位置,与绘制的图像相比过于向左或向右或向上或向下。
我还尝试了cam.unproject。我该如何解决这个问题?
我提供了一些日志,希望它能帮助您更好地理解我的情况。
---未调整大小(原始)---
调整大小调用 调整大小x:480 y:800 缩放x:1.0 y:1.0
(按钮最初所在的坐标以及按钮响应输入的位置) 缩放前X:398 Y:75 缩放后X:398 Y:75 Gdx输入X:398 Y:75 Cam unproject X:240.26144 Y:400.53613
---调整大小后---
调整大小调用 调整大小x:807 y:743 缩放x:1.68125 y:0.92875
-按钮出现在屏幕上的位置-
缩放前X:542 Y:38 缩放后X:322 Y:40 Gdx输入X:542 Y:38 Cam unproject X:240.13632 Y:400.5924
-按钮响应的触摸坐标-
缩放前X:677 Y:36 缩放后X:402 Y:38 Gdx输入X:677 Y:36 Cam unproject X:240.2692 Y:400.59595
谢谢!

1
从更新中删除 true - noone
@noone 不行... 没有效果。 - Hyunwoo Lim
等等……你在谈论按钮,但是你有一个PerspectiveCamera,是吗? - noone
你找到解决问题的方法了吗? - Robin Ellerkmann
@RobinEllerkmann 哈哈,我还是卡住了,但我找到原因了,尽管我不知道如何解决。所以,我嵌套了一个实现inputhandler的私有类来覆盖一些东西。显然,私有类中的Gdx.graphic.getWidht()返回正确的值。但是,如果我尝试像这样做... float x = getWidth() / 480,它总是返回1... PS.我的配置宽度是480。 - Hyunwoo Lim
显示剩余3条评论
2个回答

0

我终于找到了解决我的问题的方法。

问题在于我不知道浮点数除法。

链接。我需要进行浮点数/整数的除法运算。这篇文章很好地解释了浮点数除法。

感谢大家的帮助。


1
请发布您修改后的代码。我也遇到了相同的问题。 - salih kallai
@salihkallai 没有太多要发布的内容。只是当您使用浮点数和整数进行计算时,浮点数会被转换为整数,因此返回类型将是整数。这会使值失去其精度。 例如) 浮点数 + 整数 = 整数 :) - Hyunwoo Lim

0

我曾经遇到过类似的问题。 在我的touchDown方法中,我使用以下代码将世界坐标进行了转换:

Vector3 testPoint3 = new Vector3();
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    testPoint3.set(screenX, screenY, 0);
    camera.unproject(testPoint3);
    testPoint.set(testPoint3.x * GameWorld.BOX_TO_WORLD, testPoint3.y * GameWorld.BOX_TO_WORLD);
    //And then check the Fixture
    if(myFixture.testPoint(testPoint.x, testPoint.y)) {
        System.out,println("hit");
    }
}

但是相机的宽度和高度就像你所说的,是整个屏幕的宽度和高度。因此,您需要使用视口进行反投影。 viewport.unproject(testPoint3)

GameWorld.BOX_TO_WORLD 在我的情况下是0.01f,因为我选择了1米=100像素。


我刚刚注意到,这是一个非常老的问题:D - KarlTheGreat

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