我正在使用LibGdx创建一个具有等距透视的游戏。我的代码基于以下示例:等距瓷砖拾取
我需要在屏幕上居中放置一个互动程序。我试过用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);
有什么想法吗?谢谢
您的代码不起作用的原因是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
方法所做的只是在不平移相机的情况下更改相机的方向。
通过将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。