2010-09-13 78 views
5

我想知道當我有「坡道」和+1高度的瓷磚時(見下圖),我可以如何在鼠標下獲得正確的「活動」瓷磚。等距屏幕到地圖


Example Isometric Image

當我的世界是平的,一切正常,沒有問題。一旦我添加了一個高度爲+1的瓷磚,以及一個回到+0的斜坡,我的屏幕 - >地圖例程仍然看起來好像一切都是「平坦的」。

在上圖中,綠色「斜坡」是我想渲染和計算鼠標 - >地圖的真實瓦片,但是您看到「下方」的藍色瓦片是計算得到的區域。所以如果你將鼠標移動到任何深綠色的區域,它會認爲你在另一塊瓷磚上。

,這裏是我的地圖渲染(很簡單)

canvas.width = canvas.width; // cheap clear in firefox 3.6, does not work in other browsers 
for(i=0;i<map_y;i++){ 
    for(j=0;j<map_x;j++){ 
     var xpos = (i-j)*tile_h + current_x; 
     var ypos = (i+j)*tile_h/2+ current_y; 

     context.beginPath(); 
     context.moveTo(xpos, ypos+(tile_h/2)); 
     context.lineTo(xpos+(tile_w/2), ypos); 
     context.lineTo(xpos+(tile_w), ypos+(tile_h/2)); 
     context.lineTo(xpos+(tile_w/2), ypos+(tile_h)); 
     context.fill(); 

    } 
}  

這裏是我的鼠標 - >地圖程序:

ymouse=((2*(ev.pageY-canvas.offsetTop-current_y)-ev.pageX+canvas.offsetLeft+current_x)/2); 
xmouse=(ev.pageX+ymouse-current_x-(tile_w/2)-canvas.offsetLeft); 
ymouse=Math.round(ymouse/tile_h); 
xmouse=Math.round(xmouse/(tile_w/2)); 

current_tile=[xmouse,ymouse]; 

我有一種感覺,我不得不重新開始,並實施一個基於世界的地圖系統,而不是一個簡單的屏幕 - >地圖例程。

謝謝。

回答

2

你的假設是正確的。爲了「挑選」世界幾何,你的例程需要了解世界(而不僅僅是基本級別的tile配置)。也就是說,沒有任何關於當前拾取的瓷磚高度的概念(通過您當前的算法),沒有辦法確定是否應該將鄰近的瓷磚(或者更遠的瓷磚,取決於允許的高度)確定採摘光線截獲。

你已經有了最後的可能點。剩下的就是在世界空間中定義光線的其餘部分,並檢查該光線與世界幾何體的交點。

2

如果像圖片,你的視角總是45度,總是從同一方向,鼠標 - >地圖例程可以使用一個算法是這樣的:

  1. 計算I,瓦片j的作爲你正在做的(你最終的價值xmouse,ymouse)
  2. 查看高度和角度瓷磚在我,j
  3. 給定的高度和角度,這塊瓷磚相交的採摘射線嗎?如果是這樣,請設置lasti,lastj = i,j
  4. 遞增/遞減i,j沿着對角線向對角線方向一步
  5. 我們已經從地圖的邊緣掉下來了嗎?如果是這樣,返回lasti,lastj。否則,請回到2.

根據瓦片的最大高度,您可能必須僅檢查2個瓦片,而不是一直查看地圖邊緣。

3是棘手的部分,取決於你的世界幾何。畫一些三角形,你應該能夠弄清楚。或者您可以嘗試查看功能intersect_quadrilateral_ray() here