2012-02-27 57 views
0

我知道關於等軸測圖很多建議,但我已經閱讀了大部分建議,並沒有解決我的問題。 爲了更加簡單,我重寫了C#的代碼(此代碼將在Android平臺上使用) 我需要將屏幕線放到等距座標系。等距屏幕映射問題

在這裏,我們去,我用1:2瓦對我來說64×32,我用這個代碼

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

打造鑽石地圖主要的問題是如何讓鼠標下的公式對我有用。

回答

0

由於這個問題還沒有得到解答,並且它是「等距屏幕」的最佳結果之一,所以我想我會回答這個問題(更不用說我剛剛完成了這個)。

由於你有一個從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的的:

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

現在擺脫x從第二個方程中減去第一個方程:

(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的,但是因爲你在android上運行它,所以我認爲它並不重要。