2013-05-13 75 views
11

我有一个呈现PNG图像的屏幕(BaseScreen实现了屏幕界面)。点击屏幕时,它将角色移动到触摸的位置(用于测试目的)。渲染和触摸输入之间的libgdx坐标系差异

public class DrawingSpriteScreen extends BaseScreen { 
    private Texture _sourceTexture = null; 
    float x = 0, y = 0; 

    @Override 
    public void create() { 
     _sourceTexture = new Texture(Gdx.files.internal("data/character.png")); 
    } 

    . 
    . 
} 

在渲染过程中的屏幕上,如果用户接触屏幕时,我抢了触摸的坐标,然后用这些来渲染人物形象。

@Override 
public void render(float delta) { 
    if (Gdx.input.justTouched()) { 
     x = Gdx.input.getX(); 
     y = Gdx.input.getY(); 
    } 

    super.getGame().batch.draw(_sourceTexture, x, y); 
} 

问题对于从左下方位置绘制图像开始(如在LibGDX维基说明)的坐标和坐标触摸输入从左上角开始。所以我遇到的问题是我点击右下角,它将图像移到右上角。我的坐标可能是X 675 Y 13,触摸时会靠近屏幕的顶部。但角色显示在底部,因为坐标从左下角开始。

为什么是什么?为什么坐标系颠倒了?我是否使用错误的对象来确定这一点?

回答

17

为了检测碰撞,我使用camera.unproject(vector3)。我设置vector3为:

x = Gdx.input.getX();  
y = Gdx.input.getY(); 
z=0; 

现在我通过这个载体,camera.unproject(vector3)。使用此矢量的xy绘制您的角色。

+1

有很多这样的问题在那里,很多答案说,你需要做的camera.unproject的,但我当我与libGDX开始我根本不知道该怎么做,然后(即使用新的矢量坐标)。这是我当时发现的唯一答案,指出了这一点,非常感谢,很好的答案! – 2015-03-13 10:32:42

6

你做得对。 Libgdx通常以“原生”格式提供坐标系统(在本例中为原生触摸屏坐标,以及默认的OpenGL坐标)。这不会产生任何一致性,但它确实意味着图书馆不必介入您和其他所有人之间。大多数OpenGL游戏使用一个相对任意的“世界”坐标映射到屏幕上的相机,所以世界/游戏坐标通常与屏幕坐标非常不同(所以一致性是不可能的)。请参阅Changing the Coordinate System in LibGDX (Java)

有两种方法可以解决此问题。一个是改变你的触摸坐标。另一种是使用不同的相机(不同的投影)。

修复触摸坐标,只需从屏幕高度减去y即可。这有点破解。更一般地说,你希望从屏幕上“不投射”到世界上(参见 Camera.unproject() variations)。这可能是最简单的。

或者,至修复相机请参阅“Changing the Coordinate System in LibGDX (Java)”或this post on the libgdx forum。基本上你定义一个自定义的相机,然后设置SpriteBatch虽然固定相机以使用而不是默认的:

// Create a full-screen camera: 
camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
// Set it to an orthographic projection with "y down" (the first boolean parameter) 
camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
camera.update(); 

// Create a full screen sprite renderer and use the above camera 
batch = new SpriteBatch(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
batch.setProjectionMatrix(camera.combined); 

,它是“游泳上游”了一下。您将遇到其他渲染器(ShapeRenderer,字体渲染器等),它们也将默认为“错误”的相机并需要修复。

4

我有同样的问题,我只是做了这个。

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

    screenY = (int) (gheight - screenY); 
    return true; 
} 

并且每次你想从用户那里输入时不要使用Gdx.input.getY(); 改为使用(Gdx.graphics.getHeight() - Gdx.input。getY()) 为我工作。

1

下面的链接讨论了这个问题。

Projects the given coords in world space to screen coordinates.

您需要使用方法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); 

项目世界空间中给出的世界坐标以屏幕坐标。

camera.project(worldCoors); 

使用投影坐标。

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

    OnTouch(); 

    return true; 
}