2016-04-13 35 views
1

我正在使用LibGdx創建具有等角度透視的遊戲。我的代碼是基於這個例子:Isometric Tile Picking如何在等距場景中使用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); 

任何想法? 謝謝!

回答

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方法以前在做什麼簡單地改變相機的方向,而不平移它。

+0

我不認爲你想從位置減去一半的屏幕尺寸。 – Tenfour04

+0

好, 使用你的提示它看起來更好,但它不準確。 爲什麼我們不需要涉及等距變換矩陣?我有點失落了 – Alejandro

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。