2016-04-13 10 views
1

私はLibGdxを使用して等角投影パースペクティブでゲームを作成しています。 私のコードはこの例に基づいています:Isometric Tile PickingLibgdxを使用してアイソメトリックなシナリオでカメラを移動する方法

私は画面にタイルを中央に配置する必要があります。私は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); 

ありがとう! pickedTileXpickedTileY世界座標の両方で各タイルは直交格子で、幅と高さが1個の単位であるあるので、あなたのコードが動作しない

答えて

1

理由があります。

あなたが見ているタイルの方にカメラを配置するには、クリックしたタイルを実際に探す必要はありません。ポイントのワールド座標と画面サイズだけが必要です。次のコードは、トリックを行う必要があります。

あなたが lookAtメソッドを使用して、以前にやっていた何を
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); 

は、単純にそれを変換せずにカメラの向きを変えました。

+0

私はあなたが画面サイズの半分をその位置から減算したいとは思わない。 – Tenfour04

+0

ok、 あなたのヒントを使用するとうまく見えますが、それは正確ではありません。 アイソメトリ変換行列を使用する必要がないのはなぜですか?私はこれで少し失われている – 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の方法がうまくいかなかった理由はわかりませんが、それは意味があります)。

バシムありがとうございます。