Guía de acciones Drag and Drop en código GML
Si has empezado con Game Maker, es muy posible que hayas utilizado las acciones Drag&Drop para programar tus objetos, has podido hacer juegos sencillos y te has habituado a la interfaz del programa.
Una vez hecho varios proyectos, es el momento de dar el salto, hacer cosas más complejas, y eso pasa por codificar en gml. Pero si no estás acostumbrado a programar, pasar de hacer acciones Drag and Drop a escribir en GML puede ser muy frustante, ya que el cambio puede ser un poco confuso.
Una manera de hacerlo más fácil de entender es relacionar cada botón de acción con una función (a veces un grupo de funciones o instrucciones). De esta manera, sustituimos una acción por código GML, y la transición resulta más fácil.
En versiones anteriores de Game Maker, veía en internet documentos con la equivalencia entre acciones y GML. Como no lo he visto en Game Maker Studio, a continuación vamos a hacer una referencia dónde veremos la acción y su código equivalente.
Explicación de la tabla de referencia
La intención es ayudar a los usuarios para familiarizarse con el código, y así utilizar el lenguaje de Game Maker. No explicaremos las funciones, ni sus parámetros de entrada o su salida, ni poner ejemplos de cómo usarlos. Eso ya lo iremos haciendo en futuros posts, además de la documentación de Game Maker.
Para cada acción, haré una tabla con 3 columnas: la primera con el icono y nombre de la acción, la segunda las opciones que aparecen para modificar dicha acción y la tercera su código equivalente. Tendrá un aspecto parecido a éste:
Acción | Opciones | Código GML |
---|---|---|
Move fixed |
Direction: seleccionable con fechas Speed: número |
///Código GML speed = numero; |
La columna de Opciones concretaremos el tipo de datos, número o texto principalmente, que espera como entrada, y veremos que tendrá una equivalencia en el código.
El código GML puede ser, como hemos dicho anteriormente, una función o una serie de instrucciones varias. A veces pondrá dos posibles soluciones, para que podamos comparar. Es posible que veamos más parámetros en las funciones GML que en las acciones, simplemente pondré los que den el mismo resultado, sabiendo que un cambio en ellos hará otros efectos. Por ejemplo:
draw_text(x, y, "Hola"); draw_text_ext(x, y, "Hola", 1, 1); draw_text_colour(x, y, "Hola", c_white, c_white, c_white, c_white, 1); draw_text_transformed(x, y, "Hola", 1, 1, 0);
Son iguales, pero usar una función u otra es para poder usar los parámetros que más se adecuan a cada situación. En esta referencia sólo pondré una función, y si existiesen más parámetros dejaré el valor por defecto.
Código GML de los atributos comunes
Ya comentamos en su momento, en los detalles de una acción en Game Maker, que existen propiedades comunes a la mayoría de las acciones, y que no explicaré en cada acción. Nos referimos al apartado Applies to, al check Relative y el check NOT (de negación).
Applies to / Aplica a
En este apartado vemos tres opciones, para saber que dicha acción se ejecuta en Self, el objeto dónde se añade, Other, el objeto que afecta a la colisión y Object: cualquier objeto que le digamos.
Para Self no hay que hacer nada extra, pero para las otras opciones usaremos la instrucción with
.
with (other) { //Código GML de la tercera columna } with (nombre_objeto) { //Código GML de la tercera columna }
Relative
Si damos un valor a una variable, por ejemplo score
, con la acción correspondiente, perderemos el valor que ya tenía. Esta casilla se utiliza para no perder ese valor y aumentarlo/incrementarlo. Su equivalencia se hace con el operador +=
. Por ejemplo, para aumentar en 10 puntos la variable score
, usamos Set Variable, en value ponemos 10 y marcamos el check Relative. El código equivalente en GML es:
score += 10;
Otro ejemplo que se usaría en una función, si creamos un objeto con el check Relative, sería así:
instance_create(x + 20, y + 20, object_enemy);
NOT
En las acciones comparación, se suele distinguir fácilmente porque tienen forma de hexágono, suele verse el check NOT. Se utiliza para hacer la negación de la pregunta, y se usa el símbolo de exclamación. Por ejemplo
if (x != 50) if (!place_free(x, y))
Recordemos que en funciones que devuelven si es verdad o falso, booleanas, tenemos varias maneras de escribir la condición.
//Todo esto es lo mismo if (!place_free(x, y)) if (place_free(x, y) == false) if (place_free(x, y) != true)
Cuando programamos podemos hacerlo de la manera en que nos sintamos más a gusto.
Y ahora sí, empieza la guía de acciones para convertir a código GML.
Guía de acciones a código GML
Tienes a continuación la guía completa de todas las acciones y su código. Verás un apartado para cada pestaña.
La pestaña move
Acción | Opciones | Código GML |
---|---|---|
Move free | direction: numero speed: número |
Usando variables
direction = numero; speed = numero; Usando una función motion_set(direction, speed); |
Acción | Opciones | Código GML |
---|---|---|
Move Towards |
x: número y: número speed: número |
move_towards_point(x, y, speed); |
Acción | Opciones | Código GML |
---|---|---|
Speed Horizontal |
Hor. speed: número |
hspeed = numero; |
Acción | Opciones | Código GML |
---|---|---|
Speed Vertical |
Vert. speed: número |
vspeed = numero; |
Acción | Opciones | Código GML |
---|---|---|
Set Gravity |
direction: número gravity: número |
gravity_direction = numero; gravity = numero; |
Acción | Opciones | Código GML |
---|---|---|
Reverse Horizontal |
hspeed = -hspeed; |
Acción | Opciones | Código GML |
---|---|---|
Reverse Vertical |
vspeed = -vspeed; |
Acción | Opciones | Código GML |
---|---|---|
Set Friction |
Friction: número |
friction = numero; |
Acción | Opciones | Código GML |
---|---|---|
Jump to Position |
x: número y: número |
x = numero; y = numero |
Acción | Opciones | Código GML |
---|---|---|
Jump to Start |
x = xstart; y = ystart; |
Acción | Opciones | Código GML |
---|---|---|
Jump to Random |
Snap hor: número Snap vert: número |
move_random(snap_hor, snap_vert); |
Acción | Opciones | Código GML |
---|---|---|
Align to grid |
Snap hor: número Snap vert: número |
move_snap(snap_hor, snap_vert); |
Acción | Opciones | Código GML |
---|---|---|
Bounce |
precise: booleano against: solid objects all objects |
Objetos sólidos
move_bounce_solid(precise); Todos los objetos move_bounce_all(precise); |
Acción | Opciones | Código GML |
---|---|---|
Set Path |
path: ruta speed: número at end (número): 0-stop 1-continue from start 2-continue from here 3-reverse relative: booleano |
path_start(path, speed, at_end, relative); |
Acción | Opciones | Código GML |
---|---|---|
End Path |
path_end(); |
Acción | Opciones | Código GML |
---|---|---|
Path Position |
position: número 0-1 |
path_position = numero; |
Acción | Opciones | Código GML |
---|---|---|
Path Speed |
speed: número |
path_speed = numero; |
Acción | Opciones | Código GML |
---|---|---|
Step Towards |
x: número y: número speed: número stop at: booleano |
mp_linear_step(x, y, speed, stop_at); |
Acción | Opciones | Código GML |
---|---|---|
Step Avoiding |
x: número y: número speed: número avoid: booleano |
mp_potential_step(x, y, speed, avoid); |
La pestaña main1
Acción | Opciones | Código GML |
---|---|---|
Create Instance |
object: objeto x: número y: número |
instance_create(x, y, objeto); |
Acción | Opciones | Código GML |
---|---|---|
Change Instance |
change into: objeto perform events: booleano |
instance_change(change_into, perform_events); |
Acción | Opciones | Código GML |
---|---|---|
Destroy Instance |
instance_destroy(); |
Acción | Opciones | Código GML |
---|---|---|
Destroy at Position |
x: número y: número |
position_destroy(x, y); |
Acción | Opciones | Código GML |
---|---|---|
Change Sprite |
sprite: sprite subimage: número speed: número |
sprite_index = nombre_sprite; image_index = numero; image_speed = numero; |
Acción | Opciones | Código GML |
---|---|---|
Color Sprite |
color: color alpha: número |
image_blend = color; image_alpha = numero; |
Acción | Opciones | Código GML |
---|---|---|
Play Sound |
sound: sound loop: booleano |
audio_play_sound(nombre_sonido, 0, loop); |
Acción | Opciones | Código GML |
---|---|---|
Stop Sound |
sound: sound |
audio_stop_music(nombre_sonido); |
Acción | Opciones | Código GML |
---|---|---|
Check Sound |
sound: sound |
if sound_isplaying(nombre_sonido) |
Acción | Opciones | Código GML |
---|---|---|
Previous Room |
room_goto_previous(); |
Acción | Opciones | Código GML |
---|---|---|
Next Room |
room_goto_next(); |
Acción | Opciones | Código GML |
---|---|---|
Restart Room |
room_restart(); |
Acción | Opciones | Código GML |
---|---|---|
Different Room |
room: room |
room_goto(room); |
Acción | Opciones | Código GML |
---|---|---|
Check Previous |
if (room_previous(room) != -1) |
Acción | Opciones | Código GML |
---|---|---|
Check Next |
if (room_next(room) != -1) |
La pestaña main2
Acción | Opciones | Código GML |
---|---|---|
Set Alarm |
number of steps: número in alarm no: 0-11 |
alarm[0..11] = numero; |
Acción | Opciones | Código GML |
---|---|---|
Set Time Line |
time line: timeline position: número start: booleano loop: booleano |
timeline_index = nombre_timeline: timeline_running = booleano; timeline_lop = booleano; |
Acción | Opciones | Código GML |
---|---|---|
Time Line Position |
position: número |
timeline_position = numero; |
Acción | Opciones | Código GML |
---|---|---|
Time Line Speed |
speed: número |
timeline_speed = numero; |
Acción | Opciones | Código GML |
---|---|---|
Start Time Line |
timeline_running = true; |
Acción | Opciones | Código GML |
---|---|---|
Pause time Line |
timeline_running = false; |
Acción | Opciones | Código GML |
---|---|---|
Stop Time Line |
timeline_running = false; timeline_position = 0; |
Acción | Opciones | Código GML |
---|---|---|
Display Message |
message: cadena |
show_message(texto); |
Acción | Opciones | Código GML |
---|---|---|
Open URL |
URL: url |
url_open(url); |
Acción | Opciones | Código GML |
---|---|---|
Restart Game |
game_restart(); |
Acción | Opciones | Código GML |
---|---|---|
End Game |
game_end(); |
Acción | Opciones | Código GML |
---|---|---|
Save Game |
filename: nombre archivo |
game_save(nombre_archivo); |
Acción | Opciones | Código GML |
---|---|---|
Load Game |
file name: nombre archivo |
game_load(nombre_archivo); |
Acción | Opciones | Código GML |
---|---|---|
Replace Sprite |
sprite: sprite filename: nombre archivo images: número |
sprite_replace(sprite, nombre_archivo, numero, 0, 0); |
Acción | Opciones | Código GML |
---|---|---|
Replace Background |
background: background filename: nombre archivo |
background_replace(nombre_background, nombre_archivo); |
La pestaña control
Acción | Opciones | Código GML |
---|---|---|
Check Empty |
x: número y: número objects: Only Solid All |
Objetos sólidos
if (place_free(x, y)) Todos los objetos if (place_empty(x, y)) |
Acción | Opciones | Código GML |
---|---|---|
Check Collision |
x: número y: número objects: Only Solid All |
Objetos sólidos
if (place_free(x, y)) Todos los objetos if (place_empty(x, y)) |
Acción | Opciones | Código GML |
---|---|---|
Check Object |
object: objeto x: número y: número |
if (place_meeting(x, y, nombre_objeto)) |
Acción | Opciones | Código GML |
---|---|---|
Test Chance |
side: número |
if(floor(random(numero)) == 0) |
Acción | Opciones | Código GML |
---|---|---|
Check Question |
question: cadena |
if (show_question(cadena)) |
Acción | Opciones | Código GML |
---|---|---|
Test Expression |
expression: expresion |
if (expresion) |
Acción | Opciones | Código GML |
---|---|---|
Check Mouse |
button: no left middle right |
if(mouse_check_button(button)) |
Acción | Opciones | Código GML |
---|---|---|
Check Grid |
Snap Hor: número Snap Vert: número |
if (place_snapped(snap_hor, snap_vert)) |
Acción | Opciones | Código GML |
---|---|---|
Start Block |
{ |
Acción | Opciones | Código GML |
---|---|---|
End Block |
} |
Acción | Opciones | Código GML |
---|---|---|
Else |
else |
Acción | Opciones | Código GML |
---|---|---|
Exit Event |
exit; |
Acción | Opciones | Código GML |
---|---|---|
Repeat |
times: número |
repeat(numero) |
Acción | Opciones | Código GML |
---|---|---|
Call Parent Event |
event_inherited(); |
Acción | Opciones | Código GML |
---|---|---|
Execute Code |
No aplica |
Acción | Opciones | Código GML |
---|---|---|
Comment |
comment: cadena | Una línea
//cadena Un bloque de líneas /* cadena */ |
Acción | Opciones | Código GML |
---|---|---|
Set Variable |
variable: nombre variable value: valor |
nombre_variable = valor; |
Acción | Opciones | Código GML |
---|---|---|
Draw Variable |
variable: nombre_variable x: número y: número |
draw_text(x, y, nombre_variable); |
La pestaña score
Acción | Opciones | Código GML |
---|---|---|
Set Score |
new score: número |
score = numero; |
Acción | Opciones | Código GML |
---|---|---|
Test Score |
value: número operation: equal to smaller than larger than |
Igual que
if (score == numero) Menor que if (score < numero) Mayor que if (score > numero) |
Acción | Opciones | Código GML |
---|---|---|
Draw Score |
x: número y: número caption: cadena |
draw_text(x, y, "cadena" + string(score)); |
Acción | Opciones | Código GML |
---|---|---|
Clear highscore |
highscore_clear(); |
Acción | Opciones | Código GML |
---|---|---|
Set Lives |
new lives: número |
lives = numero; |
Acción | Opciones | Código GML |
---|---|---|
Test Lives |
value: número operation: equal to smaller than larger than |
Igual que
if (lives == numero) Menor que if (lives < numero) Mayor que if (lives > numero) |
Acción | Opciones | Código GML |
---|---|---|
Draw Lives |
x: número y: número caption: cadena |
draw_text(x, y, "cadena" + string(lives)); |
Acción | Opciones | Código GML |
---|---|---|
Set Health |
value (0-100): número |
health = numero; |
Acción | Opciones | Código GML |
---|---|---|
Test Health |
value: número operations: equal to smaller than larger than |
Igual a
if (health == numero) Menor que if (health < numero) Mayor que if (health > numero) |
Acción | Opciones | Código GML |
---|---|---|
Draw Health |
x1: número y1: número x2: número y2: número back color: color bar color: color |
draw_healthbar(x1, y1, x2, y2, health, back_color, bar_color, 0, true, true); |
La pestaña extra
Todas las acciones de partículas se detallarán próximamente.
Acción | Opciones | Código GML |
---|---|---|
Set Cursor |
sprite: sprite cursor: don’t cursor show |
cursor_sprite = nombre_sprite; Sin cursor windows_set_cursor(cr_none); Monstrando cursor windows_set_cursor(cr_default); |
La pestaña draw
Acción | Opciones | Código GML |
---|---|---|
Draw Self |
draw_self(); |
Acción | Opciones | Código GML |
---|---|---|
Draw Sprite |
sprite: sprite x: número y: número subimage: número |
draw_sprite(nombre_sprite, subimage, x, y); |
Acción | Opciones | Código GML |
---|---|---|
Draw Text |
text: cadena x: número y: número |
draw_text(x, y, cadena); |
Acción | Opciones | Código GML |
---|---|---|
Draw Scaled Text |
text: cadena x: número y: número xscale: número yscale: número angle: número |
draw_text_transformed(x, y, cadena, xscale, yscale, angle); |
Acción | Opciones | Código GML |
---|---|---|
Draw Rectangle |
x1: número y1: número x2: número y2: número filled: booleano |
draw_rectangle(x1, y1, x2, y2, filled); |
Acción | Opciones | Código GML |
---|---|---|
Horizontal Gradient |
x1: número y1: número x2: número y2: número color1: color color2: color |
draw_rectangle_color(x1, y1, x2, y2, color1, color2, color2, color1, false); |
Acción | Opciones | Código GML |
---|---|---|
Vertical Gradient |
x1: número y1: número x2: número y2: número color1: color color2: color |
draw_rectangle_color(x1, y1, x2, y2, color1, color1, color2, color2, false); |
Acción | Opciones | Código GML |
---|---|---|
Draw Ellipse |
x1: número y1: número x2: número y2: número filled: booleano |
draw_ellipse(x1, y1, x2, y2, filled); |
Acción | Opciones | Código GML |
---|---|---|
Gradient Ellipse |
x1: número y1: número x2: número y2: número color1: color color2: color |
draw_ellipse_color(x1, y1, x2, y2, color1, color2, false); |
Acción | Opciones | Código GML |
---|---|---|
Draw Line |
x1: número y1: número x2: número y2: número |
draw_line(x1, y1, x2, y2); |
Acción | Opciones | Código GML |
---|---|---|
Draw Arrow |
x1: número y1: número x2: número y2: número tip size: número |
draw_arrow(x1, y1, x2, y2, tip_size); |
Acción | Opciones | Código GML |
---|---|---|
Set Color |
color: color |
draw_set_color(color); |
Acción | Opciones | Código GML |
---|---|---|
Set Font |
font: font align: left center right |
draw_set_font(font); draw_set_halign(align); |
Acción | Opciones | Código GML |
---|---|---|
Take Snapshot |
filename: nombre archivo |
screen_save(nombre_archivo); |
Este artículo esta muy bien. Hacía falta algo así, ya que en yoyogames a veces no queda tan claro.
Gracias!!
Muchas gracias por el comentario. Me alegra que te sirva de ayuda.
hola David,
que bien explicado, yo acabo de empezar con gamemaker, y estoy interesada en el lenguaje que usa para programar.
me gustaria saber que lenguaje usa y si hay algun manual en español que explique el codigo que usa gamemaker y para que sirve cada instruccion, así como ejemplos. ¿algo asi como una biblia de vb6?
muchas gracias
Bueno, en el menú tienes la categoría de gml, que debería ayudarte con la parte de programación.
La intención es explicar un poco el lenguaje y luego poner muchos ejemplos pequeñitos con código de ejemplo. Si no lo estoy consiguiendo, dime por dónde estoy fallando o que falta según tu criterio.
Sobre algún manual en español, yo he visto de versiones previas de Game Maker Studio, pero ahora no hay casi nada. En inglés hay libros que no puedo decir nada porque no me he leído ninguno. Si que me gustó en su momento una campaña de kickstarter que tenía buena pinta, aunque no participé.
Si me dáis un poco de tiempo, intento hacer el manual de gml que os pueda ayudar.
¡Un abrazo!
David
Vaya trabajazo!!!
Esto es un diccionario en toda regla!!!
^v^
¡Gracias!
Excelente Aporte amigo vengo de android studio y con esto game maker se me aclara bastante ,muy bueno
A partir de ahí sólo es practicar escribiendo código. ¡A por ello!
una pregunta como puedo hacer que mi personaje al ser atacado por el enemigo parpadee unos segundos y no le ocurra nada hasta que termine de parpadear??
Para que parapdee puedes hacerlo de 3 maneras diferentes (o más):
– Creas un sprite y lo cambias, o mejor, cambias el objeto entero con
instance_change()
.– Mediante programación. Aquí te dejo un enlace de como lo haría yo.
https://www.aprendegamemaker.com/como-se-hace-1
– Con la versión actual de Game Maker, con secuencias.
Con la primera opción, como cambias de objeto ya puedes hacer que no le ocurra nada. Con las otras opciones, tendrías que tener varios estados en el objeto y que solo te puedan atacar en un estado concreto.