0

等角投影図については多くのアドバイスがあることは知っていますが、それらのほとんどを読んでも問題は解決しませんでした。もっと簡単にするために C# のコードを書き直します (このコードは Android プラットフォームで使用されます)。

では、64x32 の 1:2 タイルを使用して、このコードを使用してダイヤモンド マップを作成します。

private void drawIsoGrid(PaintEventArgs e)
{
    for(int y=0;y<20;y++)
        for(int x=0;x<20;x++)
        {
            float rx = (x - y) * (surface.Width) / 2 - globX;
            float ry = (x + y) * (surface.Height) / 2 - globY;
            e.Graphics.DrawImage(surface,rx,ry);
        }

ここでマップコードをスクロールするためにグローバルアンカーも使用します

protected override void OnMouseMove(MouseEventArgs e)
{
    mouseCoordsX = e.X;
    mouseCoordsY = e.Y;
    if(e.Button==MouseButtons.Left)
    {
        globX += prevX - e.X;
        globY += prevY - e.Y;
        this.Invalidate();
    }
    prevX = e.X;
    prevY = e.Y;            
}

主な問題は、どの式が私にとって役立つマウスの下にタイルを取得するかです。

4

1 に答える 1

0

これには回答がなく、ここでは「アイソメトリック スクリーン」の上位の結果の 1 つであるため、これに回答することにしました (これを終えたばかりであることは言うまでもありません)。

iso グリッドからスクリーン座標にマップする関数があり、それは逆関数を使用した線形変換であるため、逆方向に進んで他の関数を取得できます。それでは、それだけにしましょう。

行きたい場所:

rx = (x - y) * (surface.Width) / 2 - globX
ry = (x + y) * (surface.Height) / 2 - globY

に:

x = <something>
y = <something>

これらを同時に解決するのが最も簡単です。グローバルを両側に追加します。

rx + globX = (x - y) * (surface.Width) / 2
ry + globY = (x + y) * (surface.Height) / 2

で割り(surface.Width) / 2(surface.Height) / 2:

(rx + globX) / (surface.Width / 2)  = x - y
(ry + globY) / (surface.Height / 2) = x + y

yほぼ完了です。両方の方程式を足して'sを取り除きましょう。

(rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2) = 2 * x

x を取り除くために、最初の式を 2 番目の式から引きます。

(ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2) = 2 * y

両方の方程式を 2 で割ると、暫定的に完了します。

x = ((rx + globX) / (surface.Width / 2) + (ry + globY) / (surface.Height / 2)) / 2
y = ((ry + globY) / (surface.Height / 2) - (rx + globX) / (surface.Width / 2)) / 2

これで、画面に関するグリッド座標が得られました。(a / (b / c)) / c基本的にこれは と同じなので、これをいくつかきれいにしましょうa / b。 を取り除くことができますc。この場合は2です。

x = (rx + globX) / surface.Width + (ry + globY) / surface.Height
y = (ry + globY) / surface.Height - (rx + globX) / surface.Width

したがって、画面の x と y の位置を取り、x と y のグリッド位置を返す関数を作成できるはずです。私はC#にあまり詳しくないので、intでなければならないfloat値をどのように処理するのかわかりませんが、Androidでこれを実行しているので、それは本当に問題ではないと思います.

于 2012-07-30T01:31:25.847 に答える