Moviéndose

Obviamente, un aspecto importante de los juegos es el movimiento de las instancias de los objetos. Cada instancia tiene dos variables internas x e y que indican la posición de la instancia. (Para ser precisos, indican el lugar donde se encuentra el punto de origen del sprite). La posición (0,0) es la esquina superior izquierda del cuarto. Puedes cambiar la posición de la instancia al cambiar los valores de sus variables x e y. Es lo que debes hacer si deseas movimientos más complicados. Este código normalmente se coloca en el evento step del objeto.

 

Si el objeto se mueve con velocidad y dirección constantes, hay una manera más fácil de lograrlo. Cada instancia tiene una velocidad horizontal (hspeed) y vertical (vspeed). Ambas se indican en píxeles por paso (step). Una velocidad horizontal positiva indica movimiento a la derecha, una velocidad horizontal negativa indica movimiento a la izquierda. La velocidad vertical positiva es movimiento hacia abajo y la negativa indica movimiento hacia arriba. Por lo que sólo debes establecer estos valores una vez (por ejemplo en el evento de creación) para dar al objeto un movimiento constante.

 

Hay otra manera muy diferente de especificar el movimiento, usando dirección (en grados 0-359), y velocidad (no debe ser negativa). Puedes configurar y leer estas variables para especificar un movimiento arbitrario. (Internamente se convierte a valores de hspeed y vspeed). También tenemos la fricción y la gravedad, y la dirección de la gravedad.

 

Finalmente, tenemos la función motion_add(dir,speed) para agregar movimiento al actual.

 

Para concluir, cada instancia tiene las siguientes variables y funciones referentes a su posición y movimiento:

 

x Su posición x.

y Su posición y.

xprevious Su posición x anterior.

yprevious Su posición y previa.

xstart Su posición x inicial en el cuarto.

ystart Su posición y inicial en el cuarto.

hspeed Componente horizontal de la velocidad.

vspeed Componente vertical de la velocidad.

direction Su dirección actual (0-360, contra las manecillas del reloj, 0 = a la derecha).

speed Su velocidad actual (píxeles por step).

friction Fricción actual (píxeles por step).

gravity Cantidad actual de gravedad (píxeles por paso).

gravity_direction Dirección de la gravedad (270 es hacia abajo).

motion_set(dir,speed) Establece el movimiento a la velocidad speed y la dirección dir.

motion_add(dir,speed) Agrega el movimiento al movimiento actual (como una suma vectorial).

Existe  un gran número de funciones para ayudarte a definir el movimiento:

place_free(x,y) Devuelve si la instancia colocada en la posición (x, y) está libre de colisión. Normalmente se emplea para revisar antes de mover la instancia a la nueva posición.

place_empty(x,y) Devuelve si la instancia colocada en la posición (x, y) no se encuentra con nadie. Esta función también toma en cuenta las instancias no sólidas.

place_meeting(x,y,obj) Devuelve si la instancia colocada en la posición (x,y) se encuentra con un el objeto obj. obj puede ser un objeto en cuyo caso la función devuelve verdadero si se encuentra con una instancia de ese objeto. También puede ser el id de una instancia, o la palabra especial other.

place_snapped(hsnap,vsnap) Devuelve si la instancia está alineada con los valores de snap hsnap y vsnap.

move_random(hsnap,vsnap) Mueve la instancia a una posición libre, y la alinea con los valores hsnap y vsnap,  al igual que la acción correspondiente.

move_snap(hsnap,vsnap) Alinea la instancia, como la acción correspondiente.

move_wrap(hor,vert,margin) Teleporta la instancia cuando sale del room al lado opuesto. hor indica si debe teleportarse horizontalmente y vert indica si debe teleprotarse verticalmente. margin indica cuánto debe salir el origen de la instancia del room para teleportarse (es decir, un margen alrededor del room). Esta función se usa normalmente el evento Outside.
move_towards_point(x,y,sp) Mueve la instancia con velocidad sp hacia el punto (x,y).

move_bounce_solid(adv) Rebotar contra objetos sólidos, como la acción correspondiente. adv indica si se emplea rebote avanzado, que toma en cuenta las paredes inclinadas.

move_bounce_all(adv) Rebotar contra todas las instancias, en lugar de sólo con las sólidas.

move_contact_solid(dir,maxdist) Mover la instancia en la dirección dir hasta que haya contacto con un objeto sólido. Si no hay collision en la posición actual, la instancia es colocada justo antes de donde ocurre una colisión. Si ya hay una colisión en la posición actual, la instancia no se mueve. Puedes especificar la distancia máxima a mover la instancia maxdist (emplea un número negativo para indicar distancia arbitraria).

move_contact_all(dir,maxdist) Igual que la función anterior pero esta vez se detiene hasta que haya contacto con cualquier objeto, no solo sólidos.

move_outside_solid(dir,maxdist) Mueve la instancia en la dirección dir hasta que no esté al alcance de un objeto sólido. Si no hay collision en la posición actual, no se mueve la instancia. Puedes especificar la distancia máxima a mover (usa un valor negativo para indicar una distancia arbitraria).

move_outside_all(dir,maxdist) Igual que la anterior pero se mueve hasta estar fuera de alcance de cualquier objeto, no solo objetos sólidos.

distance_to_point(x,y) Devuelve la distancia de la caja límite de la instancia actual hacia el punto (x,y).

distance_to_object(obj) Devuelve la distancia de la instancia actual a la instancia más cercana del objeto obj.

position_empty(x,y) Indica si no hay nada en la posición (x,y).

position_meeting(x,y,obj) Indica si en la posición (x,y) hay una instancia obj. obj puede ser un objeto, una id de una instancia, o las palabras clave self, other o all.