2010-09-13 18 views
5

Próbuję dowiedzieć się, jak uzyskać prawidłową "aktywną" płytkę pod myszką, gdy mam "rampę" i +1 wysokość płytek (patrz rysunek poniżej).Izometryczny ekran mapy


Example Isometric Image

Kiedy mój świat jest płaski, wszystko działa bez problemu. Po dodaniu kafelka o wysokości +1, wraz z pochylnią cofającą się do +0, mój ekran -> rutynowa mapa nadal wygląda tak, jakby wszystko było "płaskie".

Na powyższym zdjęciu zielona "rampa" to prawdziwa płytka, którą chcę renderować i obliczyć kursor -> map, jednak niebieski kafelek "poniżej" to obszar, który jest obliczany. Jeśli więc przesuniesz mysz w jeden z ciemnych, zielonych obszarów, myślisz, że jesteś na innej płytce.

Tu jest moja mapa render (bardzo prosty)

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(); 

    } 
}  

A oto moja mysz -> Mapa rutyna:

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

mam wrażenie, muszę zacząć od nowa i wdrożenia światowy system map, a nie prosty ekran -> rutynowe mapy.

Dzięki.

Odpowiedz

2

Twoje założenie jest poprawne. Aby "wybrać" geometrię świata, rutyna musi być świadoma świata (a nie tylko konfiguracji płytki poziomu podstawowego). Oznacza to, że bez jakiejkolwiek koncepcji wysokości płytek w pobliżu aktualnie wybranej (według aktualnego algorytmu), nie ma możliwości ustalenia, czy sąsiedni kafelek (lub jeszcze dalej, w zależności od dopuszczalnej wysokości) powinien być przechwycone przez zbieranie promienia.

Masz już ostatni możliwy punkt promienia pobrania. Pozostaje jedynie zdefiniowanie pozostałej części promienia w przestrzeni świata i sprawdzenie tego promienia dla skrzyżowań z geometrią świata.

2

Jeśli, tak jak na zdjęciu, twój kąt jest zawsze 45 stopni i zawsze w tym samym kierunku, mysz -> Mapa rutyna może wykorzystać coś algorytmu takiego:

  1. oblicz I, J płytki jako robisz obecnie (twoja ostateczna wartość xmouse, ymouse)
  2. Sprawdź wysokość i kąt płytki na i, j
  3. biorąc pod uwagę wysokość i kąt, czy ta płytka przecina promień pobrania? Jeśli tak, ustaw lasti, lastj = i, j
  4. inkrementacja/dekrementacja, j krok w poprzek w stronę widza
  5. czy spadliśmy z krawędzi mapy? Jeśli tak, zwróć lasti, lastj. W przeciwnym razie cofnij się do 2.

W zależności od maksymalnej wysokości kafelka, możesz sprawdzić tylko 2 płytki, a nie całą drogę do krawędzi mapy.

3 jest trudną częścią i zależy od geometrii Twojego świata. Narysuj kilka trójkątów i powinieneś być w stanie to rozgryźć. Lub możesz spróbować spojrzeć na funkcję intersect_quadrilateral_ray() here.