2010-09-13 13 views
5

Estoy tratando de averiguar cómo puedo obtener el mosaico "activo" correcto debajo del mouse cuando tengo "rampa" y mosaicos de altura +1 (vea la imagen a continuación).Pantalla isométrica para asignar


Example Isometric Image

Cuando mi mundo es plano, todo funciona sin problemas. Una vez que agregue un mosaico con una altura de, digamos, +1, junto con una rampa que se remonta a +0, mi pantalla -> rutina de mapa sigue pareciendo como si todo fuera "plano".

En la imagen de arriba, la "rampa" verde es la baldosa real que quiero representar y calcular el mouse -> mapa, sin embargo, la baldosa azul que ves "debajo" es el área que se calcula. Entonces, si mueves el mouse a cualquiera de las áreas verdes oscuras, piensa que estás en otra casilla.

Aquí está mi mapa render (muy simple)

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

    } 
}  

Y aquí es mi ratón -> Mapa de rutina:

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

tengo la sensación de que voy a tener que empezar de nuevo y poner en práctica un sistema de mapas basado en el mundo en lugar de una simple pantalla -> rutina de mapas.

Gracias.

Respuesta

2

Suposición es correcta. Para "elegir" en contra de la geometría mundial, su rutina debe ser consciente del mundo (y no solo de la configuración de nivel base). Es decir, sin ningún concepto de la altura de las fichas cerca de la que se selecciona actualmente (por su algoritmo actual), no hay manera de determinar si una ficha vecina (o una más lejos, dependiendo de la altura permitida) debe ser interceptado por la selección de rayos.

Ya tiene el último punto posible de su rayo de recolección. Lo que queda es definir el resto del rayo, en el espacio-mundo, y verificar ese rayo para las intersecciones con la geometría del mundo.

2

Si, como la imagen, el ángulo de visión es siempre 45 grados y siempre desde la misma dirección, el puntero del ratón -> rutina mapa podría utilizar un algoritmo algo como:

  1. calcular i, j de la baldosa como que está haciendo actualmente (el valor final de xmouse, ymouse)
  2. mirar hacia arriba la altura y el ángulo de baldosas en i, j
  3. dada la altura y el ángulo, no se cruzan esta baldosa recoger el rayo? Si es así, establezca lasti, lastj = i, j
  4. incremente/disminuya i, j un paso diagonalmente hacia el visor
  5. ¿hemos caído al borde del mapa? Si es así, devuelve lasti, lastj. De lo contrario, vuelva a 2.

Dependiendo de la altura máxima de un mosaico, puede que tenga que marcar solo 2 mosaicos, en lugar de ir hasta el borde del mapa.

3 es la parte difícil, y depende de la geometría de tu mundo. Dibuja algunos triángulos y deberías ser capaz de resolverlo. O puede intentar ver la función intersect_quadrilateral_ray() here.

Cuestiones relacionadas