如何使用Libgdx

时间:2016-04-13 15:22:11

标签: libgdx isometric

我正在使用LibGdx创建一个等角透视游戏。 我的代码基于此示例:Isometric Tile Picking

我需要在屏幕中居中。我尝试使用camera.lookAt()但它不起作用。

public boolean tap(float screenX, float screenY, int count, int button) {

    touch.set(screenX, screenY, 0);
    cam.unproject(touch);
    touch.mul(invIsotransform);

    pickedTileX = (int) touch.x;
    pickedTileY = (int) touch.y;
    cam.lookAt(pickedTileX, pickedTileY, 0);

任何想法? 谢谢!

2 个答案:

答案 0 :(得分:1)

您的代码不起作用的原因是因为pickedTileXpickedTileY都在世界坐标中,其中每个图块的宽度和高度均为1个单位正交网格。

要将相机对准您正在查看的图块,您实际上并不需要找出单击的图块。您只需要点的世界坐标和屏幕大小。以下代码应该可以解决问题:

public boolean tap(float screenX, float screenY, int count, int button) {
    touch.set(screenX, screenY, 0);
    cam.unproject(touch);

    //Centralise the camera around the touch point
    cam.position.set(touch.x - cam.viewportWidth / 2,
                     touch.y - cam.viewportHeight / 2,
                     cam.position.z);

您以前使用lookAt方法执行的操作只是更改了相机的方向而未进行翻译。

答案 1 :(得分:0)

通过将 Basim Khajwal 的响应与渲染图算法中使用的相同公式相结合,我终于找到了解决问题的方法。

    float x_pos = (pickedTileX * tileWidth / 2.0f) + (pickedTileY * tileWidth / 2.0f);
    float y_pos = -(pickedTileX * tileHeight / 2.0f) + (pickedTileY * tileHeight / 2.0f);

    touch.set( x_pos,  y_pos, cam.position.z);
    cam.position.set(  touch.x , touch.y, cam.position.z);

现在我可以将任何瓷砖居中,即使旋转和缩放我的场景也能很好地工作。 (我不确定为什么Basim的方法效果不好,这很有意义。)

非常感谢Basim。