Introducción al Desarrollo de Videojuegos con GameMaker · Módulo 12: Depuración, optimización, exportación y publicación.

Opciones de compilación y configuración de plataformas

Clase 58 de 60 · 55 min

También disponible en: EN

Introducción a la configuración técnica del proyecto

A lo largo de los módulos anteriores, has programado mecánicas de salto, sistemas de colisión precisos, inteligencia artificial básica, interfaces gráficas con el evento Draw GUI y un bucle jugable completo para nuestro plataformas 2D retro. No obstante, un videojuego no se compone únicamente de su lógica interna; para que una obra sea percibida como un producto pulido, profesional y listo para distribuirse, debe contar con una configuración técnica impecable. Hasta este punto del aprendizaje, al pulsar el botón de ejecución ('Play'), GameMaker compila una versión temporal de pruebas que se ejecuta en una ventana estándar con parámetros genéricos, mostrando a menudo un icono predeterminado por el motor, un título de ventana básico y ajustes de pantalla que podrían no hacer justicia a la estética pixel art de tu obra.

La fase de preparación para la entrega exige configurar de manera minuciosa las Opciones del Juego (Game Options). En esta lección aprenderás a definir la identidad formal de tu juego mediante metadatos (nombre oficial, versión, autoría, derechos de copia), a establecer un control estricto sobre el escalado visual para evitar que los píxeles se distorsionen o desenfoquen, a incorporar iconos personalizados en todos los tamaños estándar del sistema operativo y a diseñar una experiencia de arranque limpia mediante pantallas de inicio y splash screens. Asimismo, desglosaremos las dos grandes vías de compilación que ofrece GameMaker: la Máquina Virtual (VM) y el Compilador YoYo (YYC), comprendiendo cuándo utilizar cada una y cómo el Administrador de Configuraciones te permite alternar entre perfiles de desarrollo y producción sin alterar manualmente tu código fuente.

El panel de Game Options: Estructura y metadatos del proyecto

En GameMaker, el centro de comando para los ajustes de compilación y empaquetado es la ventana de 'Game Options', accesible desde el icono de engranaje ubicado en la barra de herramientas superior del entorno de trabajo, o mediante el panel del explorador de recursos (Asset Browser). Al abrir esta ventana, observarás una división jerárquica en dos secciones principales: 'Main' (ajustes globales compartidos) y las opciones específicas de cada plataforma objetivo (Windows, macOS, Ubuntu, HTML5, Android, iOS, consolas, entre otras, según los módulos de exportación instalados y tu licencia activa).

La sección 'Main' establece los cimientos del proyecto. Aquí se determina el identificador único del juego, el orden de sincronización de datos y parámetros universales de memoria. Sin embargo, es en la sección específica de tu plataforma principal —como la pestaña 'Windows' para proyectos de escritorio— donde se articulan los metadatos que el sistema operativo y las tiendas digitales (como Steam o itch.io) utilizarán para catalogar y presentar tu aplicación ejecutable.

Campo de MetadatosPropósito TécnicoFormato / Ejemplo RecomendadoImpacto en el Usuario Final
Display NameNombre público de la aplicación que se muestra en la barra de título de la ventana y en el administrador de tareas.Aventura Retro: El RescateEs el primer texto visible que identifica al videojuego cuando se ejecuta o se minimiza.
Product ID / GUIDIdentificador global único generado para el registro del software en el sistema operativo.Cadena alfanumérica en formato UUID/GUID (generada automáticamente).Evita colisiones con otros programas y permite que los instaladores identifiquen actualizaciones legítimas.
Version InfoNumeración formal que indica el ciclo de vida y madurez del programa (Major, Minor, Build, Revision).1.0.0.0 (Lanzamiento inicial) 1.0.1.0 (Parche de corrección)Permite al sistema operativo y a los clientes de distribución verificar si un archivo descargado es más reciente que el instalado.
Company & CopyrightDatos legales y de autoría incrustados en las propiedades del archivo ejecutable binario (.exe).Compañía: TuNombre Studios Copyright: © 2025 TuNombre StudiosAporta formalidad comercial y protege la propiedad intelectual en los detalles del archivo del explorador.
DescriptionResumen funcional del ejecutable grabado en la tabla de recursos del binario.Videojuego de plataformas 2D desarrollado con GameMaker.Aparece en la pestaña de detalles del ejecutable y en herramientas de inspección de procesos del sistema.

Ajustes de resolución, escalado y fidelidad gráfica

Uno de los errores más frecuentes en desarrolladores novatos al exportar un juego de plataformas 2D es descuidar la configuración gráfica de la ventana y el método de escalado. Si diseñaste tus sprites con estética pixel art a una resolución base baja —por ejemplo, una resolución interna de 480x270 píxeles escalada a monitores Full HD (1920x1080)— una configuración gráfica incorrecta puede distorsionar los bordes rectilíneos de tus personajes o difuminar los mosaicos del escenario.

Dentro de la pestaña 'Graphics' de la plataforma Windows (o la plataforma correspondiente), GameMaker ofrece una serie de interruptores y selectores que alteran de forma radical la tubería de renderizado:

1. Interpolate colours between pixels (Interpolar colores entre píxeles): Esta casilla activa el filtrado bilineal por hardware. Para videojuegos modernos de alta definición con gráficos vectoriales o arte de alta resolución (High-Res 2D), esta opción suaviza los bordes y evita el corte abrupto. Sin embargo, para nuestro proyecto retro de plataformas pixel art, esta casilla DEBE ESTAR DESACTIVADA. Al desactivarla, GameMaker utiliza un muestreo por vecino más cercano (Nearest Neighbor), preservando bordes nítidos y colores puros sin provocar un efecto borroso no deseado.

2. Scaling (Escalado de visualización): Aquí puedes escoger entre 'Keep aspect ratio' (Mantener relación de aspecto) y 'Full scale' (Escala completa). 'Keep aspect ratio' es la opción recomendada universalmente para casi todos los videojuegos. Si la pantalla del usuario tiene una proporción distinta a la de tu juego (por ejemplo, una pantalla ultrapanorámica 21:9 o un monitor de oficina 4:3 frente a tu juego configurado en 16:9), GameMaker añadirá automáticamente barras negras (letterboxing o pillarboxing) uniformes en los márgenes, evitando que tus sprites se estiren horizontal o verticalmente perdiendo su proporción anatómica.

3. Synchronize with vertical blank (Sincronización vertical / VSync): Al marcar esta opción, la tasa de refresco del juego se sincroniza directamente con los hercios del monitor del usuario (típicamente 60 Hz, 144 Hz, etc.). Esto elimina por completo el 'tearing' o desgarro horizontal de imagen que sucede cuando el búfer de fotogramas de la tarjeta gráfica entrega un cuadro a mitad del barrido de la pantalla. En un juego de desplazamiento horizontal constante (side-scroller), activar VSync o gestionarlo por código resulta indispensable para garantizar que el movimiento del fondo se perciba completamente fluido.

4. Opciones de ventana (Window options): Puedes determinar si el juego inicia en modo de pantalla completa ('Start Fullscreen') o en modo ventana ('Allow the player to resize the game window'). Si permites que el usuario redimensione la ventana libremente, es vital habilitar 'Keep aspect ratio' para que la vista interna se adapte automáticamente sin romper la composición visual.

💡 Regla de oro para videojuegos pixel art: Mantén siempre desmarcada la opción 'Interpolate colours between pixels'. Si necesitas que los elementos de tu interfaz (GUI) se vean suaves pero tu mundo sea de píxeles puros, puedes controlar el filtrado dinámicamente en código utilizando la función gpu_set_tex_filter(false) para el escenario y activarla puntualmente cuando sea necesario.

Diagrama esquemático que compara el escalado manteniendo relación de aspecto con bandas negras frente al escalado forzado que distorsiona los píxeles.
Figura 1: Comparativa entre mantener la relación de aspecto original (arriba) y forzar la escala estirando la imagen (abajo). · Imagen generada con IA

Gestión de resolución y ventana mediante GML

Aunque las Opciones del Juego configuran el estado inicial al arrancar el ejecutable, un proyecto bien terminado debe permitir al usuario alterar la resolución y alternar entre modo ventana y pantalla completa durante la partida, ya sea mediante un menú de ajustes (como el explorado en el Módulo 8) o a través de teclas rápidas. Para controlar estas funciones desde GML Code, crearemos un objeto controlador que garantice un escalado ordenado.

Crea un nuevo objeto en tu proyecto y nómbralo `obj_display_manager`. Asegúrate de marcarlo como 'Persistent' (Persistente) para que sus funciones operen a lo largo de todas las salas (rooms) del juego, y colócalo en la primera sala de inicio del proyecto (por ejemplo, en la pantalla de título o en una sala inicial de arranque).

// ====================================================================
// OBJETO: obj_display_manager
// EVENTO: Create
// ====================================================================
// Definimos la resolución base del diseño artístico (nativa de nuestro juego)
resolucion_ancho = 480;
resolucion_alto  = 270;
escala_ventana   = 3; // Escala inicial x3 -> Ventana resultante de 1440x810
es_pantalla_completa = false;

// Ajustar el tamaño físico de la ventana del sistema operativo
window_set_size(resolucion_ancho * escala_ventana, resolucion_alto * escala_ventana);

// Ajustar la superficie de renderizado interno de la aplicación
surface_resize(application_surface, resolucion_ancho, resolucion_alto);

// Centrar la ventana en el escritorio del usuario tras el redimensionado
alarm[0] = 1;

// Asignar el título oficial de la ventana en tiempo de ejecución
window_set_caption("Aventura Retro - Version 1.0.0");
// ====================================================================
// OBJETO: obj_display_manager
// EVENTO: Alarm 0
// ====================================================================
// Se utiliza una alarma de un fotograma para dar tiempo a que el sistema operativo
// procese el cambio de tamaño antes de reposicionar la ventana en el centro.
window_center();
// ====================================================================
// OBJETO: obj_display_manager
// EVENTO: Step
// ====================================================================
// Permitir alternar pantalla completa con la tecla F11 o combinación Alt + Enter
var presiono_f11 = keyboard_check_pressed(vk_f11);
var presiono_alt_enter = (keyboard_check(vk_alt) && keyboard_check_pressed(vk_enter));

if (presiono_f11 || presiono_alt_enter) {
    es_pantalla_completa = !es_pantalla_completa;
    window_set_fullscreen(es_pantalla_completa);
    
    // Si regresamos a modo ventana, debemos asegurar que conserve el tamaño y centrado
    if (!es_pantalla_completa) {
        window_set_size(resolucion_ancho * escala_ventana, resolucion_alto * escala_ventana);
        alarm[0] = 1;
    }
}

Con este código integrado, tu juego mantiene un control matemático riguroso sobre su superficie de dibujado (`application_surface`). Sin importar cuán grande sea el monitor donde se abra el archivo compilado, la proporción de píxeles internos no sufrirá distorsiones ni artefactos gráficos imprevistos.

Identidad visual: Iconos y pantallas de carga (Splash Screens)

La identidad visual de un videojuego comienza mucho antes de que el jugador vea el primer frame de juego en pantalla. Al navegar por la carpeta donde está instalado el ejecutable, al anclar el acceso directo en la barra de tareas de Windows, o al esperar a que los recursos pesados de audio e imágenes se descompriman en la memoria RAM, los elementos de presentación visual marcan la frontera entre un experimento casero y una obra profesional.

Configuración y requisitos del icono (.ico)

En la pestaña 'Images' de las opciones de Windows en GameMaker, encontrarás la casilla para cargar el icono de la aplicación. Para sistemas Windows, este archivo no puede ser una simple imagen PNG o JPEG arbitraria; debe ser un contenedor formal en formato `.ico` que integre internamente múltiples resoluciones cuadradas con canal alfa (transparencia). Si proporcionas un único tamaño diminuto (como 16x16 píxeles), el explorador de archivos intentará estirarlo a 256x256 en la vista de iconos grandes, generando una mancha borrosa e ininteligible.

Resolución RequeridaUbicación de Despliegue en el Sistema OperativoRecomendación de Diseño
16 x 16 pxBarra de título de la ventana y pestaña pequeña del Administrador de Tareas.Silueta extremadamente simplificada, alto contraste, sin detalles finos ni textos.
24 x 24 / 32 x 32 pxAcceso directo en el menú de inicio y barra de tareas estándar de Windows.El rostro del protagonista o el objeto insignia del juego con bordes limpios.
48 x 48 / 64 x 64 pxVista de cuadrícula de iconos medianos en el Explorador de archivos.Detalles cromáticos intermedios y sombras que aporten tridimensionalidad.
128 x 128 / 256 x 256 pxVista de iconos gigantes en Windows y visualización previa en paneles de control.Ilustración completa con calidad de logotipo, sombreado sutil e iluminación definida.

Para generar este archivo, diseña tu icono maestro en un lienzo cuadrado de 256x256 píxeles en tu programa de edición gráfica preferido. Exporta ese archivo en formato PNG transparente y utiliza una herramienta de conversión a icono (como convertidores especializados de software libre o editores dedicados como GIMP o Aseprite) para compilar las resoluciones mencionadas en un único archivo con extensión `.ico`. Al cargarlo en GameMaker, el motor incrustará automáticamente la tabla de recursos de imagen en la cabecera del archivo binario durante la compilación final.

Pantallas de carga y Splash Screens

La 'Splash Screen' es la imagen estática que se muestra de forma inmediata mientras el sistema operativo inicializa el entorno de ejecución de GameMaker y transfiere los bancos de sonido e imágenes desde el almacenamiento secundario hacia la memoria física. En la pestaña 'Images' de la plataforma seleccionada, puedes especificar una imagen de presentación (comúnmente de 1920x1080 píxeles).

En proyectos de escritorio livianos compilados con la arquitectura estándar de GameMaker, la carga suele tomar fracciones de segundo, haciendo que la pantalla de presentación apenas sea perceptible. Sin embargo, para crear una secuencia de entrada profesional (donde se muestre el logotipo de tu estudio seguido de las advertencias legales antes de mostrar el menú principal), la práctica estándar en la industria independiente consiste en crear una sala dedicada (`rm_splash_intro`) como la primera sala en el árbol de recursos del proyecto. Esta sala contiene una secuencia automatizada controlada por una línea de tiempo o una alarma simple que realiza una transición suave hacia `rm_menu_principal` una vez concluida la animación.

Opciones de compilación: Máquina Virtual (VM) vs YoYo Compiler (YYC)

En la esquina superior derecha del espacio de trabajo de GameMaker, al desplegar el menú de objetivos de exportación ('Target Platform'), encontrarás una opción fundamental denominada 'Output' (Salida), donde puedes alternar entre dos tecnologías de compilación enteramente distintas: VM (Virtual Machine) y YYC (YoYo Compiler). Comprender la diferencia arquitectónica entre ambas opciones es esencial para optimizar tus tiempos de trabajo diario y asegurar el máximo rendimiento al publicar.

Criterio de EvaluaciónMáquina Virtual (VM)YoYo Compiler (YYC)
Mecanismo de EjecuciónTraduce el código GML a una secuencia de 'bytecode' intermedio interpretado por un motor común en tiempo de ejecución.Traduce todo el código GML directamente a código fuente C++, el cual se compila a lenguaje binario de máquina nativo.
Tiempo de CompilaciónUltra rápido (generalmente entre 3 y 15 segundos). Permite iterar y probar cambios de inmediato.Significativamente más lento (desde 1 minuto hasta más de 10 minutos según el tamaño del proyecto y el procesador).
Rendimiento de ProcesamientoExcelente para la gran mayoría de juegos 2D, pero con sobrecarga en bucles matemáticos intensivos.Extremadamente veloz. Puede multiplicar la velocidad de procesamiento de cálculos lógicos e IA entre 2 y 5 veces.
Requisitos de InstalaciónNo requiere herramientas externas adicionales. Funciona inmediatamente tras instalar GameMaker.Requiere instalar herramientas de desarrollo externas oficiales (como Microsoft Visual Studio Community y el SDK de C++ en Windows).
Uso RecomendadoDesarrollo diario, depuración interactiva, sesiones de playtesting rápido.Compilación final definitiva para tiendas comerciales (Steam, consolas, móviles con cálculos de física intensos).

Para nuestro proyecto de plataformas retro 2D, la opción VM resulta más que suficiente para garantizar 60 fotogramas por segundo constantes con un consumo de recursos ínfimo. No obstante, si tu juego evoluciona para integrar algoritmos complejos de generación procedural de niveles por mazmorras, cálculos de iluminación por sombras proyectadas en tiempo real o cientos de enemigos simultáneos en pantalla mediante bucles iterativos pesados, la compilación YYC proporciona un salto de eficiencia notable al eliminar la capa del intérprete.

Gestión de entornos con el Configuration Manager

Durante el ciclo de desarrollo de un juego, es común añadir herramientas de ayuda que no deben llegar jamás a manos del jugador final: textos de depuración que imprimen variables en pantalla, atajos de teclado para teletransportarse entre habitaciones, modo invencible para el jugador o contadores detallados de memoria y fotogramas por segundo. Retirar manualmente estas líneas de código antes de exportar el juego comercial es un método propenso a errores humanos catastróficos.

GameMaker resuelve esta problemática a través del 'Configuration Manager' (Administrador de Configuraciones), accesible mediante el icono de documento con flechas junto a la barra de selección de plataformas, o haciendo clic derecho sobre el elemento 'Configurations' en el panel superior. Por defecto, todo proyecto contiene una configuración llamada 'Default'. Desde este administrador puedes crear perfiles adicionales, por ejemplo: 'Debug' (Desarrollo interno) y 'Release' (Versión comercial para distribución).

Al utilizar macros condicionales vinculadas a configuraciones, puedes definir valores distintos para una misma constante según el perfil activo seleccionado en el editor, sin alterar una sola línea de lógica en tus objetos.

// ====================================================================
// SCRIPT: scr_configuracion_macros
// ====================================================================
// Este script se ejecuta automáticamente al inicio para definir macros de compilación.

// Valor predeterminado para cualquier compilación no especificada
#macro MODO_DEPURACION_ACTIVO false
#macro MOSTRAR_HITBOXES        false

// Sobrescritura de macros para la configuración específica "Debug"
// (Solo se aplican cuando en el editor seleccionas el perfil 'Debug')
#macro Debug:MODO_DEPURACION_ACTIVO true
#macro Debug:MOSTRAR_HITBOXES        true

// Sobrescritura para la configuración "Release"
#macro Release:MODO_DEPURACION_ACTIVO false
#macro Release:MOSTRAR_HITBOXES        false

Posteriormente, en el evento `Draw` o `Draw GUI` de cualquier objeto clave (como el personaje principal o el controlador de interfaz creado en el Módulo 8), condicionas la visualización de datos técnicos a la presencia de dicha macro. Al cambiar el selector del Configuration Manager de 'Debug' a 'Release', GameMaker omitirá de raíz la lógica de depuración al generar el paquete final:

// ====================================================================
// OBJETO: obj_jugador
// EVENTO: Draw GUI
// ====================================================================
// Si la macro de depuración está activa, imprimimos telemetría en pantalla
if (MODO_DEPURACION_ACTIVO) {
    draw_set_font(-1);
    draw_set_color(c_yellow);
    
    var texto_info = "FPS Reales: " + string(fps_real) + 
                     "\nEstado Jugador: " + string(estado_actual) + 
                     "\nPosicion X/Y: [" + string(x) + ", " + string(y) + "]";
                     
    draw_text(10, 10, texto_info);
    
    // Dibujar máscara de colisión física (hitbox) en rojo translúcido si está activado
    if (MOSTRAR_HITBOXES) {
        draw_set_color(c_red);
        draw_set_alpha(0.4);
        draw_rectangle(bbox_left, bbox_top, bbox_right, bbox_bottom, false);
        draw_set_alpha(1.0);
    }
}

Ejercicios prácticos

Pon a prueba los conceptos estudiados configurando tu proyecto para una entrega profesional y pulida mediante los siguientes tres ejercicios guiados.

Ejercicio 1: Configuración integral de metadatos e identidad visual para escritorio

Accede al panel de 'Game Options' en tu proyecto del plataformas retro y realiza los siguientes ajustes en la pestaña 'Windows': asigna un 'Display Name' comercial para tu videojuego (por ejemplo, 'Super Plataformas Retro'), establece el número de versión formal en '1.0.0.0' y completa los campos de 'Company' y 'Copyright' con tus datos de desarrollador. En la sección 'Graphics', asegúrate de que la interpolación bilineal esté desmarcada y el escalado esté configurado en 'Keep aspect ratio'. Para finalizar, diseña o descarga un icono cuadrado con transparencia, conviértelo a formato multi-resolución `.ico` (integrando resoluciones de 16x16, 32x32 y 256x256) e impórtalo en el casillero correspondiente.

Criterio de validación: Compila y ejecuta el juego en modo de pruebas estándar; comprueba que la ventana exhiba tu nuevo icono en la esquina superior izquierda de su marco, que el título de la ventana coincida exactamente con el nombre asignado y que los sprites no presenten bordes borrosos.

Ejercicio 2: Controlador dinámico de escalado e información de ventana

Crea o actualiza el objeto `obj_display_manager` con las instrucciones detalladas en esta lección. Añade en su evento `Step` la capacidad de alternar entre tres tamaños predefinidos de ventana cuando el usuario presione las teclas numéricas '1', '2' y '3' (correspondientes a escalas x1 [480x270], x2 [960x540] y x3 [1440x810]), manteniendo el re-centrado automático de la ventana mediante `window_center()` a través de una alarma diferida. Mantén operativa la alternancia de pantalla completa con la tecla F11.

Criterio de validación: Inicia el juego en modo ventana; pulsa progresivamente las teclas 1, 2 y 3 para verificar que la ventana cambie de escala al instante sin deformar la relación de aspecto y centrándose suavemente en tu monitor. Presiona F11 para entrar y salir de pantalla completa sin que la superficie de la aplicación pierda nitidez.

Ejercicio 3: Segmentación de entornos de compilación mediante perfiles

Abre el Configuration Manager de GameMaker y crea un nuevo perfil de configuración denominado 'Release', manteniendo el perfil 'Default' como entorno de trabajo diario ('Debug'). En un script global, declara la macro `#macro MODO_INVENCIBLE` de forma condicional para que devuelva `true` en la configuración predeterminada y `false` en la configuración 'Release'. En el evento de colisión entre el jugador y los enemigos (programado en el Módulo 7), condiciona la pérdida de salud para que sea ignorada si `MODO_INVENCIBLE` es verdadero.

Criterio de validación: Ejecuta el juego con el perfil 'Default' seleccionado y verifica que el personaje sea inmune al daño enemigo mientras pruebas el nivel. Cambia el perfil activo en la barra superior a 'Release', vuelve a ejecutar el juego sin modificar el código y comprueba que el jugador ahora reciba daño y pierda vidas con normalidad.

Resumen

  • El panel Game Options centraliza tanto los parámetros universales del proyecto como las particularidades técnicas de cada plataforma de destino.
  • Los metadatos (Display Name, Version, GUID, Copyright) dotan de identidad formal al archivo ejecutable y facilitan su catalogación en tiendas digitales y sistemas operativos.
  • Para videojuegos pixel art 2D, es prioritario desactivar la interpolación bilineal ('Interpolate colours between pixels') y configurar el escalado en 'Keep aspect ratio' para evitar distorsiones y difuminados.
  • El formato .ico requiere integrar internamente múltiples tamaños cuadrados (16x16 hasta 256x256) para garantizar una visualización nítida en todos los contextos del sistema operativo.
  • La compilación por Máquina Virtual (VM) agiliza drásticamente las pruebas diarias de desarrollo, mientras que el Compilador YoYo (YYC) genera código binario nativo de alto rendimiento para el empaquetado final.
  • El Configuration Manager permite gestionar macros y constantes para alternar limpiamente entre entornos de depuración y compilaciones de lanzamiento comercial sin alterar el código fuente.

Practica lo aprendido

Ejercicio 1 · 1 punto

Relaciona cada componente del esquema de versionado numérico de GameMaker con la descripción técnica correspondiente:

  • Major (Primer número)
  • Minor (Segundo número)
  • Build (Tercer número)
  • Revision (Cuarto número)
Practicas sin cuenta: no se guarda nada. Regístrate para guardar tu progreso.

Ejercicio 2 · 1 punto

¿Por qué se debe mantener desactivada la opción 'Interpolate colours between pixels' en los ajustes gráficos de un proyecto con estética pixel art?

Practicas sin cuenta: no se guarda nada. Regístrate para guardar tu progreso.

Ejercicio 3 · 2 puntos

En el evento Create del objeto controlador 'obj_display_manager', escribe la línea de código necesaria para redimensionar la superficie interna de dibujo ('application_surface') a las dimensiones base nativas ('resolucion_ancho' y 'resolucion_alto').

Tu código no se ejecuta: se comprueban requisitos concretos sobre el texto.

Practicas sin cuenta: no se guarda nada. Regístrate para guardar tu progreso.

Ingresa para guardar tu progreso — Ingresar