Éste es el primero de muchos scripts para Game Maker: Studio que iré subiendo, varios de los cuales ya los tenía en mi antiguo sitio web, pero que iré mejorando y agregando nuevos.
En GML hay una función llamada move_snap(hsep, vsep), la cual posiciona a la instancia que llama al método, alineándola a una cuadrilla con celdas hsep pixeles de anchas y vsep pixeles de altas. Por ejemplo, si hsep y vsep tienen ambos un valor de 32 (move_snap(32, 32)) y la instancia que llama al método tiene x=39 e y=73, estos valores se redondean a x=32 (32 * 1) e y=64 (32 * 4).
El script que desarrollé lo llamo move_snap_iso(hsep, vsep), ya que cumple un rol similar a move_snap(hsep, vsep) con la diferencia que alinea a la instancia a una cuadrilla isométrica, en donde cada rombo tiene un ancho de hsep y un alto de vsep y posicionando la coordenada (x,y) en el centro del rombo.
Primero pedimos los argumentos y los almacenamos en variables que nos permitirán hacer el análisis correcto:
1 2 3 4 | var W = argument[0] / 2; var H = argument[1] / 2; var I = round(x / W); var J = round(y / H); |
W y H son variables que dividen el escenario en cuadrillas con la mitad del tamaño de los rombos. I y J serían la posición en la que se encuentra la instancia dentro de estas cuadrillas.
1 2 3 4 5 | if ((I mod 2 = 0 && J mod 2 = 0) || (I mod 2 == 1 && J mod 2 == 1)) { x = W * I; y = H * J; } |
Primero revisamos si los índices son ambos divisibles por 2 o ambos no lo son. Es decir, que ambos son impares o ambos son pares al mismo tiempo. En ese caso, se posiciona la instancia en la esquina superior izquierda de (W * I, H * I).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | else if (I mod 2 = 0 && J mod 2 == 1) { if (x > W * I) x = W * (I + 1); else x = W * (I - 1); y = H * J; } else if (I mod 2 == 1 && J mod 2 = 0) { x = W * I; if (y > H * J) y = H * (J + 1); else y = H * (J - 1); } |
Pueden descargar el archivo GML para importarlo a sus proyectos pinchando aquí.