¿Qué hace ++ en GameMaker?

Incremento y Decremento en GameMaker GML

07/11/2025

Valoración: 4.39 (9823 votos)

En el emocionante mundo del desarrollo de videojuegos con GameMaker, escribir código eficiente y comprensible es fundamental. GameMaker Language, o GML, nos proporciona diversas herramientas para lograrlo, y una de las más comunes son los operadores. Estos símbolos especiales nos permiten realizar operaciones matemáticas, lógicas o de asignación de forma concisa. Hoy nos centraremos en dos operadores particularmente útiles y que a menudo generan dudas: el operador de incremento ++ y el operador de decremento --.

Entender cómo funcionan estos operadores no solo te ahorrará líneas de código, sino que también es vital para evitar comportamientos inesperados en tu juego, especialmente cuando se utilizan en expresiones más complejas o en bucles. Vamos a desglosar qué hacen exactamente y, lo que es más importante, la sutil pero crucial diferencia entre usarlos antes (prefijo) o después (postfijo) de la variable.

¿Qué lenguaje usa GameMaker?
Si te preguntas que lenguaje de programación usa Game Maker, diremos que usa GML.

¿Qué son los Operadores en GML?

Antes de sumergirnos en ++ y --, recordemos brevemente qué son los operadores en el contexto de GML. Una expresión en GML es una frase que puede contener números, variables, cadenas de texto o funciones, combinados con uno o más operadores. Los operadores indican qué tipo de operación se debe realizar con esos valores.

GML ofrece una variedad de operadores para diferentes propósitos:

  • Asignación (=): Para dar un valor a una variable. Aunque == es para comparar, a veces se ve = para comparación por herencia, pero es una mala práctica. Usa = solo para asignar.
  • Combinación Lógica (&&, ||, ^^): Para combinar valores booleanos (verdadero/falso) como AND, OR y XOR.
  • Nullish Coalescing (??, ??=): Operadores modernos para manejar valores undefined o pointer_null, permitiendo asignar un valor por defecto si el original es nulo.
  • Comparación (<, <=, ==, !=, >, >=): Para comparar valores y obtener un resultado booleano (verdadero o falso).
  • Bitwise (|, &, ^, <<, >>): Para realizar operaciones a nivel de bits.
  • Aritméticos (+, -, *, /): Las operaciones matemáticas básicas de suma, resta, multiplicación y división.
  • Incremento/Decremento (++, --): Nuestros protagonistas de hoy, para sumar o restar uno a un valor.
  • División y Módulo (div, %, mod): Para obtener la parte entera de una división (div) o el resto de la división (% o mod).
  • Unarios (!, -, ~): Operadores que actúan sobre un único valor (negación booleana, negación numérica, negación bitwise).

Como ves, los operadores ++ y -- son solo una pieza dentro de un conjunto de herramientas para manipular datos en GML.

El Operador de Incremento (++) y Decremento (--)

Los operadores ++ y -- son atajos para modificar una variable numérica sumándole o restándole exactamente 1. Son muy comunes en programación porque la operación de aumentar o disminuir una unidad es una de las más frecuentes, especialmente al trabajar con contadores, índices de bucles o valores de juego como puntuaciones o vidas.

variable++; es equivalente a variable = variable + 1;

variable--; es equivalente a variable = variable - 1;

A primera vista, parecen sencillos. Sin embargo, la clave para dominarlos reside en su posición relativa a la variable: pueden ser utilizados como prefijo (++variable o --variable) o como postfijo (variable++ o variable--). Y esta posición determina el valor retornado por la expresión.

Prefijo vs. Postfijo: La Diferencia Crucial

Aquí es donde la mayoría de los programadores novatos (y a veces no tan novatos) encuentran confusión. La diferencia radica en cuándo se realiza el incremento o decremento en relación con el momento en que se utiliza el *valor* de la variable en la expresión.

Operador Prefijo (++variable o --variable):

Cuando el operador ++ o -- se coloca antes de la variable, la operación de incremento o decremento se realiza primero. El valor de la variable se actualiza, y luego, el *nuevo valor actualizado* es el que se utiliza en la expresión que contiene al operador.

Piensa en ++variable como: "Incrementa la variable, y el resultado de esta expresión es el valor después del incremento".

Operador Postfijo (variable++ o variable--):

Cuando el operador ++ o -- se coloca después de la variable, el *valor actual* de la variable (antes de la operación) es el que se utiliza en la expresión. Después de que se ha utilizado el valor original, entonces se realiza la operación de incremento o decremento sobre la variable.

¿Qué pasó con Gamemaker 2?
En abril de 2022, YoYo Games eliminó el nombre GameMaker Studio 2 para que coincida con su nuevo esquema de numeración de versiones, cambiándolo a simplemente GameMaker .

Piensa en variable++ como: "El resultado de esta expresión es el valor actual de la variable, y después de usarlo, incrementa la variable".

Ejemplo Práctico para Ilustrar la Diferencia

El texto de referencia proporciona un ejemplo perfecto para entender esto. Consideremos el siguiente código en GML:

var a = 1; show_debug_message(string(a++)); show_debug_message(string(++a));

Analicemos qué sucede paso a paso:

  1. var a = 1;: Se declara una variable llamada a y se le asigna el valor inicial de 1.
  2. show_debug_message(string(a++));:
    • Se encuentra la expresión a++. Este es un operador postfijo.
    • El sistema toma el valor actual de a, que es 1. Este valor (1) es el que se 'retorna' o se utiliza en la función string().
    • Después de que el valor 1 ha sido utilizado por string() y show_debug_message(), se realiza el incremento. La variable a pasa a valer 2.
    • Por lo tanto, el primer mensaje de depuración mostrará el valor 1.
  3. show_debug_message(string(++a));:
    • Se encuentra la expresión ++a. Este es un operador prefijo.
    • El sistema realiza el incremento primero. La variable a, que actualmente vale 2, se incrementa a 3.
    • El nuevo valor actualizado de a, que es 3, es el que se 'retorna' o se utiliza en la función string().
    • Por lo tanto, el segundo mensaje de depuración mostrará el valor 3.

La salida en la ventana de depuración sería, como indica la fuente: 1 seguido de 3.

Este ejemplo deja muy clara la distinción: el postfijo (a++) te da el valor *antes* del cambio, mientras que el prefijo (++a) te da el valor *después* del cambio.

¿Por Qué Importa Esta Diferencia?

La distinción entre prefijo y postfijo es fundamental en situaciones donde el valor de la expresión que contiene el operador se utiliza inmediatamente. Los ejemplos más comunes incluyen:

  • Asignaciones:b = a++; asignará el valor *antiguo* de a a b, y luego incrementará a. En cambio, b = ++a; incrementará a primero, y luego asignará el *nuevo* valor de a a b.
  • Bucles for: La parte de 'iteración' de un bucle for (ej. i++;) usa comúnmente el postfijo. Aunque podrías usar prefijo (++i;), en este contexto particular el efecto práctico dentro del bucle suele ser el mismo al final de cada iteración, pero el postfijo es la convención más extendida.
  • Llamadas a Funciones o Expresiones Complejas: Como se vio en el ejemplo max(num, ++num, num++) de la fuente, si una expresión utiliza el valor de una variable que también se está incrementando o decrementando en la misma línea, el orden (prefijo vs postfijo) determinará qué valor se pasa a la función o se usa en el cálculo.

Es en estas situaciones complejas donde una comprensión clara del prefijo y postfijo es vital para predecir el comportamiento de tu código.

Consideraciones Adicionales en GameMaker

El texto de referencia menciona una nota importante sobre cómo GameMaker evalúa estas expresiones en diferentes plataformas:

NOTE On the YoYo Compiler target platforms (those marked (YYC)), these expressions are evaluated from left to right, while on all other target platforms they are evaluated from right to left, meaning that this: val = max(num, ++num, num++); will give different results depending on the platform.

Esto subraya la importancia de la claridad. Cuando tienes una expresión compleja con múltiples operaciones sobre la misma variable, como en max(num, ++num, num++), el orden en que el compilador decide evaluar num, ++num y num++ puede variar entre el compilador estándar (VM) y el YoYo Compiler (YYC). Dado que ++num y num++ no solo retornan un valor sino que también modifican la variable num, el orden de evaluación afectará qué valor tiene num en el momento en que se evalúa la siguiente parte de la expresión.

Para evitar esta ambigüedad y asegurar que tu código se comporte de manera consistente en todas las plataformas, es una buena práctica evitar este tipo de expresiones donde una variable se modifica y se utiliza múltiples veces dentro de la misma sentencia compleja. Es mucho más seguro y legible dividir la operación en pasos separados:

var temp_num1 = num; var temp_num2 = ++num; var temp_num3 = num++; val = max(temp_num1, temp_num2, temp_num3); // Ahora el resultado es predecible

O realizar los incrementos/decrementos en líneas separadas antes de usar la variable en la expresión final.

El Operador de Decremento (--)

Todo lo dicho para el operador de incremento ++ se aplica de manera análoga al operador de decremento --. También tiene formas prefijo (--variable) y postfijo (variable--), con la misma regla sobre cuándo se realiza la operación y qué valor se retorna:

  • --variable (prefijo): Decrementa la variable primero, luego usa el nuevo valor.
  • variable-- (postfijo): Usa el valor actual de la variable, luego la decrementa.

Los usos típicos incluyen disminuir un contador, reducir la vida de un personaje o retroceder en un índice.

Uso en Bucles y Contadores

Uno de los lugares más comunes donde verás ++ y -- es en los bucles, especialmente en los bucles for. La estructura clásica de un bucle for es for (inicialización; condición; iteración). La parte de iteración a menudo utiliza i++ (o ++i, aunque postfijo es más común por convención) para avanzar al siguiente elemento o paso.

¿Qué hace ++ en GameMaker?
++ y -- se utilizan para sumar o restar uno (1) a un valor . Cabe destacar que colocar esto antes o después del valor al que se sumará o restará tendrá resultados ligeramente diferentes. Por ejemplo: ++a incrementará la variable y devolverá el valor incrementado.
for (var i = 0; i < 10; i++;) { // Este código se ejecuta 10 veces, con i tomando valores de 0 a 9. // i++ incrementa i después de cada iteración del bucle. show_debug_message("Iteración: " + string(i)); }

Aquí, el hecho de que i++ retorne el valor antes del incremento no afecta el flujo del bucle, ya que el valor retornado no se utiliza para controlar la condición del bucle (que usa i < 10) ni se asigna a otra variable dentro de la expresión de iteración. Simplemente cumple su función de incrementar i al final de cada paso.

De manera similar, podrías usar -- para contar hacia atrás:

for (var i = 10; i > 0; i--;) { // Cuenta atrás de 10 a 1 show_debug_message("Cuenta atrás: " + string(i)); }

Tabla Comparativa: Prefijo vs Postfijo

Característica++variable (Prefijo)variable++ (Postfijo)
Orden de OperaciónIncrementa la variable primero.Utiliza el valor primero, luego incrementa la variable.
Valor RetornadoEl valor de la variable después del incremento.El valor de la variable antes del incremento.
Uso ComúnCuando necesitas el valor ya incrementado inmediatamente.En bucles (como for) o cuando el valor retornado inmediato no es relevante.
Ejemplo Simplevar a = 5; var b = ++a; // a es 6, b es 6var a = 5; var b = a++; // a es 6, b es 5

Preguntas Frecuentes sobre ++ y -- en GML

¿Es más rápido usar ++variable o variable++ que variable = variable + 1?

En la mayoría de los casos en GML moderno, la diferencia de rendimiento entre estas formas es insignificante. Los compiladores suelen optimizar estas operaciones básicas de manera muy eficiente. La elección entre ellas debe basarse principalmente en la claridad del código y en si necesitas el valor de la variable antes o después del incremento/decremento en una expresión particular.

¿Puedo usar ++ o -- en cualquier tipo de variable?

No. Estos operadores están diseñados para funcionar con variables numéricas (enteros o reales). Intentar usarlos en variables de tipo cadena (string) o booleano resultará en un error o un comportamiento inesperado, ya que la operación de sumar o restar 1 no tiene sentido en esos tipos de datos.

¿Qué pasa si uso ++ o -- en una expresión compleja como c = a++ + ++b;?

Aunque GML permite este tipo de expresiones, no es recomendable. El orden exacto en que se evalúan a++ y ++b, y por lo tanto cómo afectan el valor final de c y los valores de a y b después de la operación, puede depender del compilador y la plataforma (como se mencionó con el ejemplo max y las diferencias entre VM y YYC). Para garantizar un comportamiento predecible, es mejor dividir esto en pasos:

var temp_a = a++; // temp_a obtiene el valor antiguo de a, luego a se incrementa var temp_b = ++b; // b se incrementa, luego temp_b obtiene el nuevo valor de b var c = temp_a + temp_b; // Se realiza la suma con los valores temporales

Aunque esto requiere más líneas, el código es mucho más fácil de leer, depurar y garantiza el mismo resultado en todas partes.

¿Debo usar siempre llaves {} con estructuras condicionales o bucles cuando uso ++ o --?

Sí, es una excelente práctica y el texto de referencia lo enfatiza. Aunque GML a menudo te permite omitir las llaves para una sola sentencia después de un if o for, hacerlo puede llevar a ambigüedades para el compilador, especialmente cuando hay operadores como ++ involucrados cerca de la condición o la sentencia. Usar llaves explícitamente (if (condicion) { sentencia; }) elimina cualquier duda sobre qué código pertenece a la estructura de control y mejora enormemente la legibilidad y el mantenimiento del código.

Conclusión

Los operadores de incremento (++) y decremento (--) son herramientas poderosas y concisas en GML para sumar o restar 1 a una variable numérica. Sin embargo, su aparente simplicidad esconde una diferencia vital basada en su posición como prefijo o postfijo, que determina cuándo se realiza la operación en relación con el momento en que se utiliza el valor en una expresión.

Comprender esta diferencia es esencial para escribir código preciso y evitar errores sutiles. Aunque son muy útiles, especialmente en bucles, se recomienda precaución al usarlos en expresiones complejas para garantizar la predictibilidad del código a través de diferentes plataformas y versiones del compilador de GameMaker. Como siempre en programación, la claridad y la legibilidad del código deben ser una prioridad, y a veces, una expresión ligeramente más larga es preferible a una concisa pero ambigua.

Si quieres conocer otros artículos parecidos a Incremento y Decremento en GameMaker GML puedes visitar la categoría Maquillaje.

Subir