Move Snap Isométrico

É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í.