我正在使用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);
任何想法? 谢谢!
答案 0 :(得分:1)
您的代码不起作用的原因是因为pickedTileX
和pickedTileY
都在世界坐标中,其中每个图块的宽度和高度均为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。