Listado de eventos
Hemos visto en el post anterior un poco como funcionan los eventos y como los usamos a la hora de añadirlos a un objeto, que es la bse para programar en Game Maker Studio. Ahora vamos a detallar cada evento, para saber cuando se desencadena y como lo podemos utilizar.
Evento Create
Este evento ocurre cuando la instancia de un objeto se crea por primera vez en una room. Es el primer evento que se ejecuta, por delante de otros que comentaremos después. Se utiliza normalmente para inicializar variables, iniciar timelines, establecer paths, etc. Se ejecutará sólo una vez por instancia.
Evento Destroy
El evento Destroy es el último que se ejecuta cuando se elimina una instancia. Normalmente no lo usaremos mucho, pero es útil para añadir comportamiento a los objetos. Por ejemplo, podemos definir una explosión, aumentar la puntuación por eliminar un enemigo, efectos de partículas o ejecutar algún sonido. Un apunte rápido y muy importante a tener en cuenta: cuando cambiamos de una room a otra, las instancias son eliminadas, a no ser que el objeto tenga la propiedad Persistent activada. El evento no se activa en este caso, solo se activa cuando le decimos expresamente que se elimine. Por ejemplo, si tenemos un enemigo que sume 5 puntos cuando lo matamos, definido en su evento Destroy, al salir de la room, si hay enemigos pendientes, no sumará esos puntos.
Eventos de alarma
Cuando queremos añadir un evento de alarma, nos aparecerá un listado que irá desde la Alarma 0 hasta la Alarma 11. Significa que podemos añadir 12 tipos de alarmas diferentes. Una alarma sólo se ejecuta cuando se ha llamado previamente mediante una acción. Ponemos una acción relacionada con la Alarma 0, por ejemplo, y le ponemos un tiempo para que se lance (el tiempo se mide en steps). Lo habitual es configurar los pasos/steps a 30 en la room, así que si ponemos una alarma con valor 30, al cabo de un segundo se ejecutaría el evento correspondiente. Un ejemplo sería crear un enemigo que cada 5 segundos cambie de dirección. Cuando creamos el enemigo, evento Create, añadimos una acción de alarma. Podemos poner como dato el número de steps multiplicado por 5. Luego añadimos el evento Alarm 0 y ahí le decimos que cambie de dirección. En el mismo evento deberíamos de volver a llamar a la acción si queremos que eso se repita siempre.
Evento Step
La unidad de tiempo usada en Game Maker Studio son los steps o pasos por segundo. En cada paso se comprueban todos los eventos y se activan los que sean necesarios mientras se ejecuta el juego. Así que en este evento podemos comprobar y ejecutar acciones en cada paso. Un evento Step en realidad contiene tres sub-eventos, Step, Begin Step y End Step. Para la gran mayoría de las cosas el evento Step es más que suficiente para poder usarlo, pero a veces queremos controlar el código que se ejecuta y en qué momento. Para ello tenemos los eventos de inicio y fin de step, para comprobar en cada paso todas las opciones en orden. El evento Step se utiliza para comprobar cosas continuamente. Por ejemplo, si queremos comprobar que estamos a una distancia de un enemigo, lo podemos comprobar en este evento. Hay que vigilar de no hacer cosas muy complicadas en este evento, ya que si tenemos muchas instancias podemos hacer relantizar nuestro juego. ¡Usadlo con precaución!
Evento Colisión
Cuando no tenemos activada la opción de Physics, podemos calcular las colisiones basadas en las máscaras de los objetos. Puede ser la máscara del sprite que tenga en ese momento o la máscara que definimos en el propio objeto. En el momento que se superpongan estas máscaras se lanza el evento. Si uno de los objetos no tiene máscara definida (podemos tener un sprite sin máscara), aunque tenga un sprite que dibuje no habrá colisiones detectadas. Si el objeto que choca con el otro es Sólido, antes de ejecutar el evento de colisión, muy importante, la instancia se coloca a la posición previa que se ha registrado la colisión, pero sólo si hay un evento de colisión creado. Si tenemos un objeto obj_player1
con un evento de colisión con el objeto obj_player2
, si en obj_player2
también tenemos este evento, ejecutará los dos eventos. No sabremos nunca en qué orden ejecutará uno o el otro. Hay que tener especial cuidado con los objetos heredados. Imaginemos que tenemos los objetos obj_child1
y obj_child2
, que heredan de obj_parent
. Quizás nos interese crear un evento colisión en obj_parent
sobre el mismo obj_parent
, para que afecte a los dos objetos hijos que hemos comentado. ¡Cuidado con las acciones que hagamos que se ejecutarán en los dos hijos!
Eventos de teclado
Cuando creamos un juego, tenemos muchas maneras para que el jugador interaccione con él, desde el ratón, el gamepad, el teclado. Para controlar todas las opciones del teclado, Game Maker proporciona una lista muy grande de subeventos que se puede utilizar para los tres eventos principales. Hablaremos de los tres eventos porque será indistinto utilizar una tecla u otra.
- Evento Keyboard Pressed: este evento se activa cada vez que se presiona una tecla.
- Evento Keyboard: este evento se lanza continuamente, en cada step o paso, mientras la tecla se mantiene pulsada.
- Evento Keyboard Released: se activa una vez se ha liberado o dejado de presionar una tecla.
Como vemos, conocer estos tres eventos es muy importante ya que hacen cosas diferentes, y podemos controlar nuestro juego de una manera más eficiente. También tenemos que tener en cuenta que los eventos de teclado se activarían en todas las instancias activas de la room dónde hayamos definido este evento, y responderán cada una a las acciones que hayamos programado. Por ejemplo, si tenemos la tecla <A> para mover al personaje y otro evento con la misma tecla para que un enemigo dispare, hará las dos cosas a la vez.
La lista de subeventos que aparece es enorme, tal y como hemos comentado, y distingue todas las opciones del teclado que tenemos. También distingue el teclado numérico (tenemos que tener activo mediante <Bloq num>), el que tenemos a la derecha, con los números que tenemos por encima de las letras.Podemos seleccionar también teclas especiales, como las superiores de funciones (<F1>, <F2>, <F3>…) como las teclas de retroceso, inicio, fin, eliminar, insertar, etc.
Como apunte último, también nos permite seleccionar dos subeventos especiales, ninguna tecla y cualquier tecla. Con la primera opción, podemos detectar que no hay interacción con el usuario, así que puede ser útil para que el personaje, si tiene una velocidad asignada, deje de moverse. Con la opción cualquier tecla podemos detectar cualquier opción del teclado sin importar cuál pulse.
Para adaptar a dispositivos móviles, Game Maker Studio nos permite aprovechar todos los eventos de teclado que hemos definido y que funcione con un área de la pantalla. De esta manera sencilla podemos crear un “touch-pad” para nuestra tablet o móvil.
Eventos de ratón
Al igual que los eventos de teclado, los eventos de ratón contiene una serie de subeventos para especificar que está sucediendo durante el juego. Al igual que cuando pulsamos cualquier tecla del teclado, con el ratón podemos detectar cuando pulsamos el botón izquierdo, el botón central y el botón derecho. Una diferencia importante respecto a los eventos de teclado que hemos comentado es que se ejecuta en todas las instancias donde hemos asignado acciones al evento, pero en los eventos de ratón actúa en la máscara que tiene el objeto (recordemos que la máscara puede ser muy diferente al sprite). ¡Así que para que funcione el objeto tiene que tener máscara!
Para el evento Left pressed, Right pressed o Middle pressed, se detecta una sola vez que se pulsa el botón indicado. Para el evento Left released, Right released o Middle released, se activa una vez cuando se ha dejado de pulsar el botón. El evento Left button, Right button o Middle button se activa en cada step o paso mientras se mantenga pulsado cada uno de los botones. Como hemos visto hasta ahora, es igual que con el teclado.
Tenemos otros eventos relacionados con el ratón, que son Mouse enter y Mouse leave. Estos no están relacionados con los botones del ratón, sino con su posición. Cuando el juego detecta que el puntero del ratón entra en contacto con la máscara del objeto, se activa el evento Mouse enter, y cuando el puntero del ratón sale de la máscara del objeto, se activa el evento Mouse leave. Estos dos eventos se activan SOLO UNA VEZ. Por ejemplo, se podrían usar para cambiar el puntero del ratón para según que objetos de inventario, botones, enemigos, etc.
Para finalizar, también tenemos el evento Global mouse, que agrupa otros sub eventos de los botones del ratón. Con los eventos globales del ratón, podemos detectar cuando se ha pulsado un botón en casos que el ratón no esté encima de un objeto, o incluso en ningún objeto. Simplemente detecta los botones, independientemente de la posición del ratón. Por ejemplo, si tenemos algún objeto con el evento Left pressed y Global left pressed configurado, generará los dos eventos cuando hagamos click sobre él. Si se hace click fuera del objeto, generará el evento global.
En dispositivos móviles, al no existir el ratón, Game Maker usa sus eventos para detectar cuando un usuario ha pulsado la pantalla (lo que se conoce como un finger tab, tap o touch). Si pulsamos una vez la pantalla, se generaría el evento Mouse Left, si pulsamos dos veces seguidas, se ejecutaría el evento Mouse Right. Para usar el multitouch o detectar que hay varios dedos pulsados en la pantalla (los típicos efectos de deslizar o desplazar, ampliar o hacer zoom, etc) ya se utiliza funciones de programación.
Otros eventos
Tenemos unos eventos especiales que los han metido en este saco, ya que son tan dispares y hacen tantas cosas diferentes que no los han podido clasificar de otro modo. Vamos a detallarlos a continuación.
- Salir de la room o outside room. Este evento se activa cuando un objeto sale de la habitación o room. No estamos hablando de su posición X/Y, estamos hablando cuando el sprite entero (la máscara) ha salido de la room. Si el objeto no tiene sprite, entonces la referencia sí que es su posición X/Y. Como vemos, los objetos que no vemos porque están fuera de la room existen, así que podemos crear un objeto fuera para que no se vea, incluso pintarlo en el Ventana de propiedades de la room.
Este evento lo usamos principalmente para eliminar objetos que ya no nos interese que aparezca. Por ejemplo, si al disparar creamos un objeto bala y sale fuera de la room, podemos destruir el objeto con este evento, ya que hemos visto que no se elimina automáticamente, y acabaríamos con millones de estos objetos moviéndose al infinito. Este evento se ejecuta una única vez. - Intersección de límites o Intersect Boundary. Que no asuste el nombre que le han puesto. Es muy parecido al anterior, pero en vez de detectar cuando sale de la habitación, detecta cuando toca justo en el límite de la room. Tiene las mismas características que el evento anterior, se detecta mediante sprite o con su posición si no lo tiene. Se puede utilizar, por ejemplo, si tenemos un objeto que es una pelota y queremos que rebote en los límites de la room, sin necesidad de crear objetos y generar el evento de colisión.
- Vistas o views. Cuando hablemos como se define la room, hablaremos en detalle sobre las vistas y su configuración. Ahora comentaremos que las vistas se utilizan para ver solo una pequeña área de toda la room, como podemos comprobar en juegos RPG o plataformas. Podemos configurar hasta 8 vistas en una misma room. Si seleccionamos esta opción aparecen varios subeventos, pero se pueden clasificar en dos categorías: los objetos que salen de nuestro vista y los objetos que tocan o llegan al límite de la vista. Las características son muy parecidas a los eventos comentados antes.
- Inicio del juego o Game Start. Este evento se activa una sola vez en todo el juego. Además, las instancias de estos objetos se tienen que colocar en la primera room de todas desde el editor de rooms, no funcionaría si creamos el objeto una vez iniciado el juego. Más abajo hablamos del orden de los eventos, pero ahora destacamos que el evento Room Start se ejecuta después del evento Create, así que si creamos variables en el evento Create las podríamos utilizar en este evento.
No es habitual usar este evento en varios objetos, aunque se puede hacer. Se suele crear un objeto controlador para que haga cosas genéricas, y este evento es útil para crear variables globales, ejecutar un sonido de fondo, leer ficheros de configuración iniciales. En resumen, todo lo que creamos necesario configurar nada más arrancar nuestro juego. - Final del juego o End Game. Al igual que el evento anterior, este evento se ejecuta una única vez cuando finaliza tu juego o se cierra la ventana. Este evento no se ejecuta en todas las exportaciones que ofrece Game Maker. Por ejemplo, en iOS los juegos nunca se cierran, se quedan “pausados”. En navegadores funcionaría cuando cerramos la pestaña donde está ejecutándose el juego, pero es recomendable probar todas las opciones para comprobar que lo hace correctamente. Se suele utilizar para grabar datos o configuraciones en ficheros.
- Inicio de room o Room Start. Este evento se ejecuta para todas las instancias que se encuentran al principio en la room. Al ser el evento Create el primero que se ejecuta, también podemos utilizar variables previamente creadas.
- Fin de room o Room End. Ocurre cuando una room termina, por ejemplo porque se cambia a otra room. Se suele utilizar para destruir objetos o casos especiales como listas o partículas, para que no ocupen memoria.
- No hay más vidas o No More Health. Game Maker utiliza un sistema de vidas que ya viene en la aplicación, que podemos utilizar o no, que usaríamos con la palabra Lives. Aunque no entendamos aún el uso de variables, nos adelantamos diciendo que es una variable global que se crea al comienzo del juego. Podemos dar valor, sumar o restar el valor de Lives/vidas, así que podemos manipularlas como creamos oportuno. El evento se activa cuando el número de vidas es inferior o igual a 0. Lo podemos utilizar para ejecutar de alguna manera un Game Over, por ejemplo con un mensaje o reiniciando la room actual.
- No tienes más energía o No More Health. Se puede llamar energía, salud o Health, que funciona igual que la variable de Lives. Es una variable global llamada Health y podemos también usarla como queramos, para dibujar una barra de energía, utlizarlo para combinarlo con las vidas, etc. El evento se ejecuta cuando su valor es más pequeño o igual que 0. Por ejemplo, podemos usar la energía y cuando llegue a 0, restarle una vida. Existen acciones propias para poder dibujar tanto la energía como las vidas que ya vienen integradas en el programa.
- Fin de animación o Animation end. Hemos aprendido en posts anteriores que los sprites pueden contener una o varias subimágenes. Si tiene más de una imagen, generará una animación infinita a la velocidad que digamos(a no ser que la controlemos programando). Cada subimagen tiene un valor numérico, que empieza con su valor 0, y podemos controlar mediante las diferentes acciones o variables. Pero muchas veces solo nos interesa saber que la animación ha terminado, es decir, que ha llegado a su última subimagen. Esto lo podemos saber gracias a este evento. Un ejemplo sería si creamos un objeto que es una explosión. Como no queremos que se repita la animación siempre, podemos hacer que cuando llegue al final desaparezca.
- Actualización de animación o Animation Update. Este evento solo se ejecuta en sprites que son de tipo esqueleto, y se usa funciones específicas para ello. En un sprite que usa ficheros de imagen sabemos su animación por cada subimagen, pero en un sprite hecho con spine sólo tenemos la secuencia que hace. Este evento ayuda a saber la orientación del esqueleto para añadir código o acciones que nos pueda interesar.
- Fin de ruta o End of Path. Ya hablaremos de rutas o paths más adelante. Os adelanto que una ruta la definimos y pintamos para un objeto. Esta ruta tiene un inicio y un fin, y con este evento podemos detectar que el objeto asociado ha finalizado todo el camino.
- Definidos por el usuario o User Defined. Es posible que queramos definir un evento propio, para separar las acciones o el código de otras opciones del objeto. Al ser un evento especial, no puede ser lanzado por el propio programa, así que eres tú el que lanzas este evento cuando lo llamas. Es muy parecido a como usamos el evento de Alarma cuando lo queremos lanzar para el siguiente step o paso, la diferencia es que aquí lo llamas al momento y volverías a la siguiente línea de código. Se utiliza cuando en diferentes partes del objeto y en eventos muy diferentes queremos que siempre se hagan las mismas acciones, y no queremos ponerlo como un Script genérico.
Evento de Dibujo
Este evento es el que manda con todo lo que se ve en pantalla cuando se ejecuta el juego, y se divide en varios subeventos separados en las siguientes categorías:
- El evento Draw estándar se divide en tres tipos:el evento Draw Begin, el evento Draw y el evento Draw End, por ese orden. Lo más habitual es usar el evento Draw, para poder pintar el sprite del objeto, pintar texto como puede ser la puntuación, barras de energía, vidas, etc. Recordemos que el evento Draw se ejecuta en cada Step o paso del juego, o sea, se ejecutará muchas veces cada segundo, así que no debemos poner acciones o códigos que pueda relantizar nuestro juego, al igual que si ponemos muchas instancias en la room. El evento siempre se ejecutará mientras la propiedad visible sea
true
, es decir, aunque no pongamos ninguna acción lo ejecutará para poder pintar su sprite por defecto. Si añadimos código, entonces estamos controlando lo que queremos pintar, por lo tanto el sprite por defecto no se pintará a no ser que lo pongamos expresamente. - Los eventos Draw Begin y Draw End funcionan de una manera muy parecida a los eventos Begin Step y Begin End. Si queremos preparar algunas acciones antes de dibujar, como cambiar algunos valores, se puede hacer con Draw Begin, y si queremos tratar algo después de dibujar, podemos usar Draw End.
- Los eventos de Draw GUI están pensados para que no afecte al escalado y a la vista o view utilizada en ese momento. Por ejemplo, si queremos dibujar un cronómetro con el evento Draw, y nuestro juego utiliza las vistas, no podemos colocarlo situandolo en la X/Y de la room, sino que se debería hacer con la vista para que siempre sea visible. Pero si utilizamos Draw GUI podemos colocarlo en la posición de pantalla que queramos independientemente de cómo sea nuestro juego: si tiene vistas o no, si lo escalamos, etc. También tenemos los eventos Draw GUI Begin y Draw GUI End parap oder usarlos tal y como hemos comentado.
- ¿Entonces qué hacen los eventos Pre Draw y Post Draw? ¿No existen los eventos de Draw Begin y Draw End? Pues parece que se suele utilizar cuando tenemos varias vistas. Pongamos un ejemplo: el típico juego de carreras cuando juegas con dos jugadores, cada uno con su mitad de pantalla. Eso se puede controlar fácilmente con vistas/views. Si tenemos un objeto
obj_coche
para cada vista, el evento Draw se ejecutaría en cada vista por separado. Es decir, si el evento Draw se ejecuta en cada paso, al tener dos vistas se ejecutaría dos veces por cada paso. Imaginemos que tenemos código en el evento Draw Begin, para preparar unos datos antes de Draw. Pasaría lo mismo, se ejecutaría dos veces, una por cada vista. Con los eventos Pre Draw y Post Draw se ejecutaría solo una vez por cada paso, ya que se ejecutan antes de que Game Maker prepare todo el canal o búfer necesario para pintar los objetos, así que podrías plantear dónde poner mejor el código, si en un evento u otro. Como véis, el programa nos da muchas posibilidades para optimizar nuestro juego, y está claro que todo lo relacionado con dibujar en la pantalla es muy importante si no queremos tener problemas de rendimiento. - El evento Resize se ejecuta solo en Windows 8 y se activa cuando detecta un cambio en el tamaño de la ventana. Aunque está en la categoría de los eventos Draw, aquí no se puede dibujar nada, solo sirve para comprobar el cambio del tamaño y hacer las acciones oportunas. De esta manera evitamos tener que comprobarlo en el evento Step (eso significa que en otros dispositivos si que habría que poner el código en ese evento).
Evento Asíncronos
Los eventos asíncronos son especiales porque no los desencadena Game Maker Studio, sino al final de una acción externa relacionada, como puede ser la carga de un archivo, la respuesta de un servidor web o cuando tratamos con paquetes dentro de una red. Básicamente, cuando lanzamos una orden o acción, como puede ser la carga de una imagen, empezará a hacerlo en paralelo y el juego también seguirá su curso. Cuando la solicitud se ha completado, enviará un aviso a Game Maker y saltará los eventos asíncronos que se han definido para este tipo de llamada. Si tenemos el mismo evento asíncrono en varios objetos, se dispararan en todas las instancias que se ha definido. La mayoría de estos eventos están relacionados con los navegadores y juegos que hagamos en formato web. Ahora los citaremos y más adelante ya entraremos en detalle con cada uno de ellos. Estos subeventos son:
- Imagen cargada o Image Loaded
- Evento HTTP o HTTP Event
- Eventos de diálogo o Dialogs Event
- Eventos IAP (In App Purchases)
- Eventos de la nube o Cloud Event
- Eventos de red o Networking Event
- Eventos de Steam
- Eventos Sociales (principalmente Facebook) o Social Event
- Evento de notificación o Push Notification Event
- Eventos de Cargar/salvar Load/Save Event
- Evento de grabación de audio o Audio Recording Event
- Evento de reproducción de audio o Audio Playback Notification Event
- Eventos del sistema (detectar dispositivos, por ejemplo) o System Event
Otros eventos fuera de los objetos
Hemos dicho que los eventos están asociados a los objetos, y damos a entender que solo podemos programar en los objetos. Existen un par de sitios más dónde podríamos asociar acciones o, mejor dicho, programar acciones mediante código GML.
- Al crear una habitación o room. Dentro de la ventana de propiedades de la room, existe un botón llamado Creation Code, dónde podemos programar acciones cuando se inicia una room.
- Cuando añadimos una instancia de esa room. Si le damos al botón derecho sobre la instancia, una de las opciones es Creation code. También podremos programar acciones SOLO para esa instancia, y así no afectaría a todos los objetos.
Entonces, ¿que se ejecutaría antes? ¿El evento Create del objeto, el que hemos añadido en la room, o el que hemos añadido en la instancia en particular?
Vamos a ver el orden de todos los eventos, ya que hay varios eventos implicados, sobretodo cuando iniciamos una room o el juego, y tenemos que tener claro ese orden para no tener sorpresas.
Orden de los eventos
El orden de los eventos no es exacto, ya que dependerá de muchas situaciones que pueden ocurrir en nuestro juego. Por ejemplo, si tenemos dos objetos que colisionan y tenemos también otros dos objetos que colisionan, no podemos tener claro cual ejecutará antes. Pero si que hay una serie de eventos que mantienen un orden al ejecutarse. Estos eventos son_
- Evento Create de cada instancia. Nos referimos al que programamod en nuestr aventana de propiedades del objeto.
- Creation Code de cada instancia. La que definimos en cada instancia de la room.
- Evento Game Start. Este evento solo ocurre en la primer room del juego.
- Creation Code de la room. El que hemos definido en la ventana de propiedades de la room.
- Evento Room Start de todas las instancias.
Imaginemos que un objeto tiene el evento Create o el evento Room Start. Si tenemos varias instancias en una misma room, ¿cuál de ellas se ejecutará antes? Dentro de las opciones de la room, podemos definir el orden de las instancias, de esta manera podemos definir como se ejecutarán sus eventos.
También tenemos eventos específicos que siguen un orden establecido. Si queremos programar algo en cada paso (step) de la velocidad de la habitación, tenemos:
- Evento Begin Step: se ejecuta justo antes del step.
- Evento Step: este evento se ejecuta justo antes que las instancias se muevan a su nueva posición.
- Evento End Step: se ejecuta al finalizar el step.
Como hemos visto, también tenemos varios eventos para dibujar , siguiendo este orden:
- Evento Pre Draw.
- Evento Draw Begin.
- Evento Draw.
- Evento Draw End.
- Evento Draw GUI Begin.
- Evento Draw GUI.
- Evento Draw GUI End.
hola David .
ando muy perdida, quisiera que un objeto obj_premio, desapareciera cuando pase un tiempo y luego vuelva a parecer pasados 4 segundos en otro sitio ¿se puede hacer? me ayudais?
gracias
Hola, ¿existe un evento de teclado en el que pueda asignar la eñe? Es que estoy creando un teclado español para hacer un juego de mecanografía pero no puedo asignar la eñe ni los acentos.
Buenas José,
evento como tal no existe. Lo que puedes hacer es en el evento Step poner algo parecido a esto:
if keyboard_check(ord("Ñ")) {
texto_final += "Ñ";
}
y así controlar cualquier cosa por teclado.
David
Me pregunto si se podra, detectar dos pulsaciones del teclado a la vez para ejecutar una accion
necesito ayuda en ese tema porfavor
Pues si no es con GML, que noralmente se controla con el evento Step y la función
keyboard_check_pressed()
, lo único que se me ocurre es crearte una variable, que se llama por ejempocontrol_teclado
, y con Key Press le sumas un valor de 1, y con Key Released le quitas 1.Luego en el evento Step miras con Test Variable si
control_teclado
tiene value 2.Espero que te sirva!
Hola David! Estoy teniendo problemas con los eventos asíncronos, estoy usando en un create la función achievement_load_leaderboard (“***”, 1, 100, filter_all player), y en un evento asíncrono social (en el mismo objeto) estoy pidiendo que me muestre que hay en el dsmap async_load. Las claves que me muestra son tres, id, name y playerid, las correspondientes a achievement_login… Porque no me muestra las claves de achievement_load_leaderboard?
Espero haberme explicado bien y que puedas ayudarme porque el tema me está volviendo loco…
Gracias!!!
Pues si haber usado los eventos asíncronos con achievement_load_leaderboard(), ni con ningúna función de Game Center o Google Play, si que te puedo decir que a veces se dispara el evento por otras causas, y debes comprar siempre la clave Id. Así que yo haría esto:
//"id" - For this function it should be achievement_leaderboard_info
var id = ds_map_find_value(async_load, "id");
if (id == achievement_leaderboard_info) {
//Aquí dentro debe estar las claves.
}
Prueba con ese código. Imagínate que se activa el evento porque primero hace el login y luego se vuelve a activar porque ya puedes cargar el leaderboard. Los ids cambian y por eso hay que siempre detectarlos y filtrarlos con if.
Espero haberte ayudado.
Gracias por la respuesta David, ya he usado también el código de comprobación de id y o me da el de achievement_our_info o undefined… estoy empezando a pensar que sea tema de la extensión de googleplayservices, quizá tenga que actualizarla. De todas formas he hecho mil pruebas y estoy viendo como se disparan los eventos asíncronos y demás así que por lo menos algo estoy aprendiendo… ¿llegaste a escribir algún artículo dedicado a estos eventos? he estado buscando y no he visto nada.
Un abrazo y de nuevo muchas gracias!
En realidad no he tocado en detalle los eventos asíncronos (tema pendiente), pero si que he hablado del evento de Networking para enviar/recibir datos en red.
Tutorial juego multiplayer
En este caso no creo que te sirva al ser temas distintos, aunque se parecen por como se trata los datos.
Muchas gracias David, de momento voy a aparcar el tema para retomarlo más adelante, así me despejo y continuo con otras partes de mi desarrollo antes de que se enquiste. Esperando este tema de eventos asíncronos! Un abrazo!
Hola estoy haciendo un juego y he usado la variable keyboard_check_pressed () y no se como poner la a me deja poren vk_up y cosas por el estilo pero no la a suelta
Si te fijas, las constantes de teclas, como vk_up, son todas las especiales.
Si quieres usar letras o números, usa la función ord(). Por ejemplo:
keyboard_check_pressed(ord('A'))
Recuerda que ord(‘A’) y ord(‘a’) daría resultados diferentes, así que yo pondría algo así
if keyboard_check_pressed(ord('A')) or keyboard_check_pressed(ord('a'))
Hola David, me fascinan tus guías, son geniales!
Tengo una consulta, pasa que cuando presiono a la vez las teclas de avanzar izquierda y derecha de mi personaje, al soltar una de ellas mi personaje avanza en la dirección en la cual mantengo presionada, pero sin la animación correspondiente hacia esa dirección, es más, se queda con el sprite de “reposo” pero mirando hacia el lado opuesto hacia donde mantengo presionado.
Porfa! como podría solucionarlo? :/
Seguramente tienes el movimiento en los eventos KeyDown (para que empiece el movimiento) y KeyUp(para que deje de moverse). Dentro de los eventos tendrás el cambio de sprite (o de dirección de sprite).
¿Es así? ¿Te mueves con la variable speed?
buenas David,una pregunta ¿como hago para que un objeto detecte a otro en una cierta distancia para que utilice una animación,y cuando este se aleje este en sprite de reposo ?
Con este código en el evento Step puedes detectar un objeto concreto a una distancia:
if distance_to_object(obj_enemigo) < rango_distancia
{
cambiar_imagen
}
Si hay varias instancias cogerá una de ellas solamente.
Buenas tardes David espero me puedas apoyar, como se puede cambiar un evento que se da por default a un objeto ?
No entiendo muy bien la pregunta. ¿A que evento te refieres?
Si quiero hacer un juego con poderes especiales osea como si por ejemplo aplastar abajo izquierda derecha y que soltara un poder cómo una bola de fuego algo por el estilo
cómo podría elaborarlo?
Nunca lo he probado… Yo tendría una lista con la combinación correcta, y añadiría en otra las teclas pulsadas. En el momento que la secuencia es correcta, ya puedes usar el poder. Si en algún momento se equivoca, vacias la lista, y si en un segundo no pulsas nada, también…
Me lo apunto para hacer en un futuro.
Simplemente gracias.
De nada 😉.
Hola David interesante articulo, es el que mas me ha ayudado y aun asi no logro la soluciones.
tengo dos objetos, un botón asimilando una tarjeta que al presionarlo activa otro obj en pantalla como si tomaras la tarjeta. el tema es que necesito que al momento de activar este objeto cambie la image_index de la tarjeta en pantalla segun la posición del jugador. pero dentro de los eventos de GML no hay ninguno que de cierta forma escuche cuando un objeto a sido activado. seria esto.
al apretar el boton
instance_activate_object(obj_tarjeta_pantalla)
instance_deactivate_object(obj_boton):
……………….
entonces necesito que este al activarse cambie su image_index. osea
obj_tarjeta_pantalla.image_index = obj_pj1.posicion;
espero puedas entender y ayudarme. saludos y gracias
Lo solucione cambiando la instancia desactivada por un visible false. pero la idea es que no se pueda interactuar con este…
Hola, estoy recien aprendiendo game maker 2 , me gustaria saber si existe alguna forma de integrar dentro del juego formularios, pensando en hacer algunas preguntas al jugador para que despues en otra etapa se muestren estas respuestas como si fuera un informe
No existen objetos predefinidos para hacer formularios. Tendrias que hacer tu mismo todo lo que quieres hacer. También puedes usar las funciones
get_string()
oget_integer()
para pedir datos al usuario con una ventana pop-up.