2012-02-27 1 views
0

アイソメトリックマップではたくさんのアドバイスがありますが、そのほとんどを読んで問題を解決していないことがわかりました。 私はもっと簡単にC#のコードを書き換えます(このコードはAndroidプラットフォームで使用されます) アイソメトリックコードにスクリーンコードを取得する必要があります。アイソメトリックな画面からマップへの問題

ここでは、私は1使用行く:私はこのコード

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;    
} 

を用いたダイヤモンドマップを構築し、私の64x32のための2のタイルを主な問題は、マウスの下でタイルを取得する方法です。

答えて

0

これは答えられていないので、ここでは「等角投影スクリーン」の結果の1つです。私はこれを答えました(私はこれを終えたばかりではありません)。

isoグリッドからスクリーン座標にマップする関数があり、これは逆関数を使った線形変換であるため、他の関数を得るために後ろに行くことができます。だからそれをやりましょう。

我々はから行きたい:それは、同時にこれらを解決するための最も簡単です

x = <something> 
y = <something> 

:に

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

。両側にグローバルを追加:(surface.Width)/2(surface.Height)/2によって

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

は分裂:ほとんど行わ

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

、のはy年代を取り除くために一緒に両方の式を追加してみましょう。

(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))/ca/bと同じである、我々はS「の、この場合2には、S」のcを取り除くことができているので、のは、この一部をクリーンアップしてみましょう:

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

だから、次のことができるようにすべきです画面のxとyの位置をとり、xとyのグリッド位置を返す関数を記述します。私は信じられないほどC#に精通していないので、私はどのようにそれが整数でなければならないフロート値を処理するのか分からないが、あなたはアンドロイドでこれを実行しているので、それは本当に問題ではないと思う。

関連する問題