2017-08-19 7 views
1

アイソメトリックマップが描画されています。LibGdx - スプライトをラインパスに従うようにする

私はスプライトの現在位置と私のスプライトが移動後にあるべき場所の目標位置取る:

// region is my TextureRegion. 
    int x1 = getIsometricX(1,1,region); 
    int x2 = getIsometricX(1,2,region); 

    int y1= getIsometricY(1,1,region); 
    int y2 = getIsometricY(1,2,region); 

をそして私がローカル/対象かどうかを確認するためにShapeRendererを使用して簡単な線を描きますポイントが正しく設定され、スプライトレンダリングの開始位置がわかるように四角形が表示されます。

renderer.setProjectionMatrix(camera.combined); 
    renderer.begin(ShapeRenderer.ShapeType.Line); 
    renderer.setColor(Color.RED); 
    renderer.line(x1 + location.getOffsetx(), y1 + location.getOffsety(), x2 + location.getOffsetx(), y2 + location.getOffsety()); 
    renderer.rect(x1 + location.getOffsetx(), y1 + location.getOffsety(), region.getRegionWidth(), region.getRegionHeight()); 
    renderer.end(); 

鉱山のすべてのスプライトは、すべてのスプライトが異なるため、アイソメトリックタイル上の位置を調整するためにoffsetXとoffsetYを設定しています。

出力は次のようになります。あなたがここに見ることができるもの

img

、スプライトを描画する始まるの出発点である(あなたはオフセットがスプライトは、その上のように見えるので、それを調整していることがわかり1,1タイル。

、あなたはスプライトの開始ドローポイントで開始し、スプライトのターゲット延伸点で終わるラインを見ることができます。

今私の質問は、そのスプライトをその行のパス上で動かすにはどうしたらいいですか?船が前進しているように見えますか?

そこで質問のメインコンセプトはどのようにポイントをターゲットに地元の点から、直線でのスプライトの移動を行うことができます。..のですか?あなたが見る必要があるかもしれません

いくつかの機能:

public int getIsometricX(int x, int y, TextureRegion region) { 
    return (x * GameTile.TILE_WIDTH/2) - (y * GameTile.TILE_WIDTH/2) - (region.getRegionWidth()/2); 
} 

public int getIsometricY(int x, int y, TextureRegion region) { 
    return (x * GameTile.TILE_HEIGHT/2) + (y * GameTile.TILE_HEIGHT/2) - (region.getRegionHeight()/2); 
} 

タイルがちょうどタイルの質感で、同じ方法を使用して描画されます。

答えて

1

他の人が同じ問題を抱えている可能性があり、私のようにそれを過度に複雑にするかもしれないので、私はこの質問に自分自身で答えたいと思います。

アイソメトリックマップ上で移動を行いたい場合は、私の誤解を守らずに、等角座標で計算してください。

フラットスクリーンマトリックスの座標で計算し、等値座標に変換する必要があります。例えば

、私は私が行うために必要なのはこれです、このラインのように上に移動したい:だからあなたはあなたの非アイソメトリック地図上0,1になりたいことを知っている

ship.y += 0.1f // when it reaches 1, then it will be at 0, 1 

ですから、この増分を行い、その後、最後のために、あなたが描く前アイソメトリック座標に変換する必要があります。

float x = (ship.x * GameTile.TILE_WIDTH/2) - (ship.y * GameTile.TILE_WIDTH/2) - (textyure.getWidth()/2); 

float y = (ship.x * GameTile.TILE_HEIGHT/2) + (ship.y * GameTile.TILE_HEIGHT/2) - (texture.getHeight()/2); 

そして、それは正確に画面上のように、アイソメトリック地図上に描画されます座標ではなく、アイソメトリック形式です。

0
for(float x : new float[targetx - currentx]) {ship.setPosition(ship.getX + x, ship.getY); } 

そして、あなたは、yについて同じことをするだろう。

編集:

私はあなたがこの私が想定し、フレーム毎に呼び出しているので、これは間違っていると思います。

代わりに、ターゲットと船の間の移動距離を把握し、x、yに1回ずつサイプ位置を距離に達するまで増やします。

+0

はい、すべてのフレームを呼び出します。毎回xとyに1を加えた場合、それは実際には直線ではありません – Jony

+0

しかし、yの差が0であれば、x軸上で増加して船が直線に移動します –

関連する問題