LibGDX触摸协调混乱

时间:2014-03-04 22:39:39

标签: java android libgdx

据我所知,libGDX坐标系默认设置,所以(0,0)位于左下角,如下图所示:

img http://gyazo.com/0e1cd9e1f7c4ee39ea38549ff754ac78.png

是否可以使其像JFrame一样工作,默认位置位于左上角?

无论如何,回到我的实际问题,android(或者至少是我的手机)触摸坐标系统全屏工作(当手机放在它的侧面时)所以默认(0,0)位置位于顶部右上角,如下图所示:

img2 http://gyazo.com/733fb20b7ce8e842a03a57a7735161ed.png

当我这样做时会发生什么:

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    System.out.println("X: " + screenX  + " Y: " + screenY);
    this.instance.player.setLocation(screenX, screenY);
    return false;
}

我只是得到触摸屏的X,Y(基于android的全屏坐标系)然后在libgdx坐标系上使用它,这是完全不同的,

所以,如果我触摸右上角,我的蓝色矩形将出现在左下角。

有没有办法让所有内容都像左上角那样在PC上工作?

6 个答案:

答案 0 :(得分:4)

您需要使用相机才能执行此操作。如果您不使用相机,我强烈建议您添加一个相机,因为这会让事情变得更容易。只需调用camera.setToOrtho(true),它将把LibGDX的坐标系切换到你想要的坐标系,左上角为(0,0)。

要使用除Gdx.graphics.getWidth / Height()之外的某个视口宽度和高度执行此操作,您可以调用camera.setToOrtho(true, viewportWidth, viewportHeight)

答案 1 :(得分:0)

我不知道如何在左上角设置它,但有一件事你可以将输入坐标转换为libgdx坐标。 我希望这可以帮助你或帮助别人:

int Screen_height = Gdx.graphics.getHeight(); // Your screen height    

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
   System.out.println("X: " + screenX  + " Y: " + (Screen_height - screenY));
   this.instance.player.setLocation(screenX, (Screen_height - screenY));
return false;
}

答案 2 :(得分:0)

是的,这很容易。 您只需从Y值中减去屏幕的高度即可。 所以: 手指位置Y =屏幕高度 - 您找到的Y值。

答案 3 :(得分:0)

有一种更简单的方法: 只需进行减法

Gdx.graphics.getHeight()-screenY

正如您所见,只需要这行代码。

答案 4 :(得分:0)

创建变量fingerY并使用减法:

fingerY= Gdx.graphics.getHeight()-screenY;

因此,如果screenY从左下角等于10并且屏幕高度等于240像素:

fingerY=240-10

然后,fingerY =左下角的230个像素,距离左上角10个像素。

答案 5 :(得分:-1)

您需要使用课程project(Vector3 worldCoords)中的方法com.badlogic.gdx.graphics.Camera

private Camera camera;
............

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {

创建向量的实例,并使用输入事件处理程序的坐标对其进行初始化。

    Vector3 worldCoors = new Vector3(screenX, screenY, 0);

将世界空间中给出的worldCoors投影到屏幕坐标。

    camera.project(worldCoors);

使用投影坐标。

    world.hitPoint((int) worldCoors.x, (int) worldCoors.y);

    OnTouch();

    return true;
}