Introducción al Desarrollo de Videojuegos con GameMaker · Módulo 6: Animaciones, sprites, fondos y tilemaps.

Introducción a los Tilemaps (mosaicos)

Clase 29 de 60 · 60 min

También disponible en: EN

De los objetos individuales a la arquitectura por mosaicos

Durante los módulos anteriores construimos las bases mecánicas de nuestro videojuego de plataformas 2D. En el Módulo 2 y en el Módulo 5 colocamos instancias individuales de un objeto sólido (por ejemplo, `obj_bloque` u `obj_suelo`) a lo largo de la sala (Room) para que nuestro personaje tuviera una superficie firme sobre la cual correr y saltar. Aunque este enfoque con instancias es intuitivo y funciona bien para prototipos de pocas pantallas, presenta limitaciones críticas en cuanto el proyecto escala hacia niveles extensos y detallados.

Cada instancia de un objeto en GameMaker consume memoria del sistema y ciclos de procesamiento del procesador (CPU). Una instancia no es una simple imagen dibujada en pantalla: es una estructura de datos compleja que contiene decenas de variables internas predeterminadas (como `x`, `y`, `speed`, `direction`, `image_index`, `image_alpha`, `mask_index`), punteros a listas de eventos y comprobaciones que el motor evalúa en cada paso del bucle de juego (Step cycle). Si un nivel mediano requiere 4.000 bloques de terreno para construir túneles, laderas, techos y plataformas flotantes, el motor se verá forzado a gestionar 4.000 instancias individuales. Esto degrada drásticamente la tasa de cuadros por segundo (FPS) y vuelve lenta e incómoda la edición manual en el Room Editor.

Para resolver este problema, la industria del videojuego 2D desarrolló hace décadas el sistema de mosaicos o Tilemaps. Un Tilemap es una matriz bidimensional ligera optimizada para renderizar enormes extensiones de escenario utilizando una única llamada de dibujo agrupada (batch draw call). En lugar de procesar miles de entidades activas, GameMaker simplemente consulta una cuadrícula de números enteros donde cada número representa una porción gráfica específica tomada de una sola imagen maestra llamada Tile Set. El impacto en rendimiento pasa de ser un cuello de botella crítico a un costo prácticamente despreciable.

CaracterísticaEscenario basado en Instancias (Objetos)Escenario basado en Tilemaps (Mosaicos)
Consumo de memoriaAlto: cada bloque reserva memoria para variables y eventos.Mínimo: una matriz bidimensional plana de enteros en memoria.
Carga sobre la CPUAlta: la CPU itera eventos y comprobaciones por cada objeto.Casi nula: el procesamiento lógico por celda solo ocurre si se solicita explícitamente.
Rendimiento gráfico (GPU)Múltiples llamadas de dibujado si no se optimiza el loteo de texturas.Extremadamente eficiente: la tarjeta gráfica dibuja todo el mapa en un único lote (vertex buffer).
Herramientas de diseñoColocación y alineación manual de instancias individuales.Pinceles rápidos, herramientas de relleno, selección por bloques y autotiling.
Uso recomendadoMecanismos dinámicos, puertas, trampas móviles, enemigos e interruptores.Suelo firme, paredes, techos, decoración estática y fondos estructurales.

Estructura fundamental: Sprite, Tile Set y Capa de Tilemap

Para dominar este flujo de trabajo en GameMaker, es imprescindible distinguir tres conceptos interconectados que con frecuencia confunden a los desarrolladores principiantes:

1. El Sprite fuente: Es el recurso gráfico en mapa de bits (generalmente un archivo PNG) importado en el Asset Browser. Contiene todas las texturas del entorno ordenadas en una cuadrícula fija, por ejemplo, casillas de 16x16 o 32x32 píxeles. 2. El recurso Tile Set: Es un recurso propio de GameMaker que se crea en el Asset Browser haciendo clic derecho y seleccionando 'Create -> Tile Set'. Este recurso toma el Sprite fuente y lo subdivide matemáticamente en una grilla regular, asignando un índice numérico a cada fragmento. 3. La Capa de Tilemap (Tile Layer): Es una capa especializada creada dentro del Room Editor. A diferencia de las capas de instancias (Instance Layers), una capa de mosaicos no almacena objetos, sino que almacena las coordenadas de la sala donde se 'estampan' los índices gráficos definidos en el Tile Set.

Diagrama esquemático que ilustra la conversión de una hoja de sprites en un conjunto de mosaicos indexados y su posterior colocación sobre la cuadrícula del nivel.
Figura 1: Flujo de trabajo modular: desde la hoja de texturas original hasta la conformación del escenario en el editor de salas. · Imagen generada con IA

La regla de oro de GameMaker: La casilla cero (Tile 0)

Existe una particularidad técnica crucial en el motor GameMaker que todo estudiante debe memorizar desde el primer día: la celda ubicada en la esquina superior izquierda de cualquier conjunto de mosaicos (columna 0, fila 0) está reservada exclusivamente por el sistema para representar el 'vacío' o ausencia de mosaico. Internamente, el valor entero 0 en la matriz de un Tilemap indica 'aquí no se dibuja nada'.

💡 ¡Atención! Si importas un sprite de tileset cuyo primer dibujo útil (por ejemplo, el bloque superior de hierba) se encuentra exactamente en la casilla superior izquierda (coordenadas x:0, y:0 del sprite), GameMaker ignorará esa ilustración gráfica al pintar. Siempre debes dejar el primer cuadrante de 16x16 o 32x32 píxeles completamente transparente en tu archivo de imagen, o configurar un desplazamiento adecuado en las propiedades del Tile Set.

Si utilizas un archivo gráfico preexistente que no incluye este espacio transparente inicial, el editor de Tile Sets de GameMaker incluye una opción automatizada en su panel de propiedades denominada 'Add Separation' o la posibilidad de ajustar los valores de 'Offset' (desplazamiento en X e Y). No obstante, la mejor práctica en el arte técnico 2D consiste en preparar las hojas de sprites desde el software de dibujo (como Aseprite, Photoshop o el editor de sprites interno de GameMaker) asegurando de antemano que la celda (0, 0) permanezca vacía.

Creación paso a paso de un recurso Tile Set

Continuando con la estética retro de nuestro proyecto de plataformas, construiremos un conjunto de terreno clásico de 16x16 píxeles con superficie de césped, capas internas de tierra y bloques de roca sólida para las zonas subterráneas. Sigue con atención los pasos a continuación:

Paso 1: Preparación del Sprite. En el Asset Browser, haz clic derecho sobre la carpeta de sprites y selecciona 'Create -> Sprite'. Asigna el nombre `spr_tileset_terreno`. Abre el editor de imagen y ajusta el tamaño del lienzo a 128 píxeles de ancho por 128 píxeles de alto. Activa la cuadrícula visual de GameMaker configurándola en 16x16 píxeles. Deja los primeros 16x16 píxeles (arriba a la izquierda) en blanco transparente. En la segunda casilla (de x=16 a x=31) dibuja la superficie plana superior de un bloque de tierra cubierto de hierba. A su lado, dibuja la esquina superior izquierda, la esquina superior derecha, los laterales verticales de tierra, el centro homogéneo de tierra y los bordes inferiores.

Paso 2: Generación del Tile Set. Haz clic derecho en el Asset Browser y selecciona 'Create -> Tile Set'. Nombra a este nuevo recurso `tls_terreno` (utilizamos el prefijo `tls_` por convención estándar de nomenclatura de la industria para los Tile Sets). En el inspector de propiedades del recurso, busca el campo 'Sprite' y asigna el recurso que creamos en el paso anterior: `spr_tileset_terreno`.

Paso 3: Calibración de dimensiones. Una vez vinculado el sprite, el editor mostrará la imagen seccionada por una malla de líneas guía. En el panel de propiedades laterales del Tile Set, verifica los siguientes valores fundamentales:

PropiedadValor para nuestro proyectoDescripción funcional
Tile Width16Anchura individual de cada celda del mosaico en píxeles.
Tile Height16Altura individual de cada celda del mosaico en píxeles.
Separation X0Espacio de separación horizontal entre celdas consecutivas.
Separation Y0Espacio de separación vertical entre filas consecutivas.
Offset X0Margen de desplazamiento inicial desde el borde izquierdo del lienzo.
Offset Y0Margen de desplazamiento inicial desde el borde superior del lienzo.

Al completar esta configuración verás que GameMaker numera automáticamente cada recuadro visible en el visualizador interactivo: la celda vacía será el 0, la primera pieza de césped será el 1, y así sucesivamente hacia la derecha y hacia abajo. Ahora este recurso está listo para ser empleado dentro de cualquier sala del juego.

Trabajando en el Room Editor con Capas de Mosaicos

Con nuestro recurso `tls_terreno` configurado, abre la sala principal del juego, por ejemplo `rm_nivel_1`. Observa el panel de capas (Layers) ubicado usualmente en la columna izquierda o superior del espacio de trabajo del Room Editor.

Por defecto, GameMaker crea una capa de fondo (`Background`) y una capa de instancias (`Instances`). Para pintar escenarios con mosaicos debemos incorporar una capa dedicada. Haz clic en el icono 'Create New Tile Layer' (representado por una pequeña cuadrícula con cuatro cuadros). Asigna a esta capa el nombre representativo `Tiles_Terreno`.

💡 Consejo de jerarquía visual: El orden de las capas en el panel del Room Editor determina qué elementos se dibujan delante de otros. Las capas situadas más arriba en la lista se dibujan por encima de las capas situadas más abajo. Por lo tanto, tu capa `Tiles_Terreno` debe colocarse por debajo de la capa `Instances` (para que el personaje y los enemigos caminen por delante del escenario y no queden ocultos detrás de las baldosas) pero por encima de las capas de `Background`.

Al seleccionar la capa `Tiles_Terreno`, notarás que la interfaz de GameMaker se adapta automáticamente abriendo la pestaña flotante 'Tile Editing'. En esta ventana se te solicitará asignar un Tile Set: selecciona `tls_terreno`. De inmediato aparecerá la paleta con todas las piezas disponibles que dibujamos en nuestro sprite.

Herramientas de pintura y atajos de productividad

El editor de salas ofrece herramientas equivalentes a un programa de dibujo matricial, optimizadas para trabajar contra la cuadrícula de la sala:

• Lápiz (Pencil Tool): Selecciona una baldosa individual o un grupo rectangular de varias baldosas en la paleta de Tile Editing y haz clic o arrastra con el botón izquierdo sobre el lienzo de la sala para estamparlas. • Borrador (Eraser Tool): Convierte cualquier celda sobre la que se haga clic en el índice 0 (transparente), eliminando el gráfico visible de esa capa sin afectar a otras capas. • Rectángulo de pintura: Permite trazar grandes áreas continuas repitiendo el patrón seleccionado. Muy útil para rellenar el interior masivo de montañas subterráneas en cuestión de segundos. • Cubo de pintura (Bucket Fill Tool): Rellena áreas continuas delimitadas que compartan el mismo índice de baldosa. • Tecla de borrado rápido: Mientras utilizas la herramienta lápiz, puedes mantener presionada la tecla Shift o el botón derecho del ratón (dependiendo de tus preferencias configuradas) para alternar al borrado inmediato sin necesidad de cambiar de herramienta en la barra superior.

Además, puedes seleccionar un bloque de 3x3 celdas directamente desde la paleta de baldosas y pintar estructuras completas de una sola pasada. Esto agiliza la construcción de plataformas flotantes: seleccionas la cabeza izquierda, el centro y la cabeza derecha simultáneamente, y las colocas con un solo clic en la escena.

Estrategias de capas: Estructura, Decoración y Profundidad

Un error común al iniciarse en el diseño de niveles consiste en intentar pintar todo el entorno en una única capa de Tilemap. Esto genera problemas visuales evidentes: si quieres colocar enredaderas o raíces colgando de un bloque de roca, o flores y piedras pequeñas sobre el césped, colocar la flor en la misma celda sobrescribirá y borrará el bloque de césped inferior, ya que una celda en una capa de Tilemap solo puede contener un único índice numérico a la vez.

La solución profesional consiste en estructurar el nivel mediante capas superpuestas de Tilemaps, cada una con un propósito bien definido y con un orden de profundidad (Depth) coherente:

1. Capa `Tiles_Fondo_Estructural`: Ubicada detrás de los personajes y de las plataformas sólidas. En ella se pintan paredes interiores de cuevas sombrías, ventanas hacia el exterior, vigas de madera de soporte o ruinas lejanas. Estas baldosas suelen diseñarse con colores menos saturados o tonos más oscuros para no competir visualmente con los elementos interactivos. 2. Capa `Tiles_Terreno`: Es la capa principal donde descansan las plataformas sólidas, suelos, techos y paredes verticales con las que interactúa el juego. 3. Capa `Tiles_Decoracion`: Situada justo por encima de `Tiles_Terreno`. En esta capa se pintan matas de hierba adicionales, flores, piedras sueltas, carteles y elementos que enriquecen el aspecto visual sin romper la estructura de las plataformas base. 4. Capa `Tiles_Primer_Plano` (Foreground): Ubicada por encima de la capa `Instances`. Se utiliza con moderación para colocar ramas de árboles gigantes que cruzan por el frente de la pantalla, bordes de cavernas en penumbra o columnas que tapan temporalmente al jugador al pasar detrás de ellas, aportando una notable sensación de profundidad tridimensional a un entorno 2D.

Manipulación de Tilemaps mediante GML Code

Aunque la mayor parte del diseño de escenarios se realiza de forma visual en el Room Editor, en GameMaker los Tilemaps son estructuras dinámicas que podemos consultar, leer y modificar en tiempo real durante la ejecución de la partida mediante GameMaker Language (GML). Para los desarrolladores que prefieran o conozcan GML Visual, existen bloques de acción equivalentes bajo la categoría 'Tiles' (como 'Get Tile' o 'Set Tile'); sin embargo, comprender las funciones en código puro proporciona una precisión y velocidad insustituibles.

Para interactuar con una capa de mosaicos por código, primero debemos obtener el identificador de la capa en la sala mediante `layer_get_id()`, y luego obtener el identificador específico del elemento Tilemap contenido en dicha capa mediante `layer_tilemap_get_id()`. Una vez obtenido dicho identificador, podemos alterar o consultar cualquier celda del escenario.

Examinemos las funciones esenciales que constituyen los cimientos para la lectura y modificación programática del terreno:

A continuación, implementaremos un ejemplo práctico y contextualizado. Crearemos un objeto controlador llamado `obj_terreno_controller` que se encargará de gestionar el acceso al Tilemap y permitirá un comportamiento dinámico común en los juegos de plataformas: destruir una baldosa de terreno agrietado cuando el jugador hace clic sobre ella con el ratón (o cuando ocurre un impacto), modificando el mapa en memoria de forma instantánea.

En el Asset Browser, crea un objeto y nómbralo `obj_terreno_controller`. En su evento **Create**, inicializamos las variables y capturamos las referencias a la capa gráfica:

// --------------------------------------------------------
// Objeto: obj_terreno_controller
// Evento: Create
// Descripción: Localiza la capa de terreno y guarda el ID del tilemap
// --------------------------------------------------------

// 1. Obtenemos el identificador de la capa creada en el Room Editor
var _layer_id = layer_get_id("Tiles_Terreno");

// 2. Extraemos el identificador del tilemap contenido en esa capa
mapa_terreno = layer_tilemap_get_id(_layer_id);

// Comprobación de seguridad en la consola de depuración
if (mapa_terreno == -1) {
    show_debug_message("ERROR: No se encontró la capa Tiles_Terreno o no contiene un Tilemap válido.");
} else {
    show_debug_message("Tilemap conectado exitosamente. ID: " + string(mapa_terreno));
}

Ahora, en el evento **Step** de este mismo objeto controlador, implementaremos una rutina interactiva simple: si el jugador presiona el botón izquierdo del ratón (`mb_left`), el sistema leerá qué baldosa hay bajo el cursor. Si existe un mosaico dibujado (índice mayor a 0), lo borrará inmediatamente estableciendo su índice a 0 (la casilla vacía):

// --------------------------------------------------------
// Objeto: obj_terreno_controller
// Evento: Step
// Descripción: Detección y destrucción de celdas bajo el puntero
// --------------------------------------------------------

// Solo actuar si el tilemap está correctamente inicializado
if (mapa_terreno != -1) {
    // Si el usuario presiona el botón izquierdo del ratón
    if (mouse_check_button_pressed(mb_left)) {
        // Leemos el índice del mosaico en la posición exacta del cursor en la sala
        var _tile_actual = tilemap_get_at_pixel(mapa_terreno, mouse_x, mouse_y);
        
        // Un índice mayor a 0 confirma la presencia de un tile sólido o visible
        if (_tile_actual > 0) {
            show_debug_message("Tile eliminado. Índice previo: " + string(_tile_actual));
            
            // Asignamos el índice 0 para borrar la celda seleccionada
            tilemap_set_at_pixel(mapa_terreno, 0, mouse_x, mouse_y);
        }
    }
}

Coloca una única instancia de `obj_terreno_controller` en la capa `Instances` de tu sala y ejecuta el juego (presionando F5). Al hacer clic sobre cualquier sección de suelo construida con el Tile Set, comprobarás que el bloque desaparece al instante. Este mecanismo no solo ilustra el funcionamiento interno de las funciones de Tilemap, sino que constituye la base para implementar paredes rompibles, túneles secretos excavables y modificación dinámica del entorno durante el juego.

Mapeo lógico de datos y preparación para las colisiones

Es fundamental tener presente que, en esta etapa, el Tilemap es puramente un elemento de representación gráfica. Si ejecutas el juego con tu personaje del Módulo 5 (`obj_jugador`) sobre una plataforma pintada exclusivamente con mosaicos, notarás que el personaje atravesará el suelo y caerá al vacío por la gravedad.

Esto ocurre porque nuestro código de colisiones del Módulo 5 estaba programado para verificar colisiones físicas contra objetos (`place_meeting(x + vel_x, y, obj_bloque)`). Al sustituir los miles de `obj_bloque` por un Tilemap, ya no existen instancias sólidas con las cuales colisionar bajo ese método tradicional.

En la siguiente lección abordaremos en profundidad el sistema de 'Colisiones precisas con Tilemaps', donde adaptaremos los scripts de movimiento del jugador para que interroguen directamente a las celdas matemáticas del Tilemap utilizando la función `tilemap_get_at_pixel()`. De este modo, mantendremos la física de plataformas sólida, responsiva y perfecta sin necesidad de colocar un solo objeto de colisión en la sala.

Buenas prácticas para el diseño con Tile Sets

A medida que los escenarios de tu videojuego se vuelvan más extensos y visualmente ricos, mantener el orden en los recursos gráficos será la clave para no perder tiempo rehaciendo trabajo. Ten en cuenta las siguientes recomendaciones profesionales:

1. Mantén un tamaño de cuadrícula unificado en todo el proyecto: Si tus personajes y mecánicas se diseñaron para un paso de 16x16 píxeles, diseña todos tus tilesets a 16x16. Mezclar baldosas de 16x16 con otras de 24x24 o 32x32 en el mismo plano genera discontinuidades visuales y descalibra los cálculos matemáticos de colisión.

2. Diseña siempre las piezas de unión (9-Slice modular): Para cualquier bioma (tierra, roca, metal), asegúrate de dibujar el conjunto canónico de 9 piezas mínimas: 4 esquinas exteriores, 4 paredes/bordes exteriores y 1 centro sólido. Esto te permitirá construir cualquier forma geométrica rectangular o plataforma sin dejar bordes cortados de manera antiestética.

3. Nomenclatura rigurosa de capas: Utiliza nombres estándar en todas las salas de tu juego (por ejemplo, `Tiles_Fondo`, `Tiles_Terreno`, `Tiles_Decoracion`). Cuando desarrollemos sistemas en GML que busquen capas por su nombre en cadena de texto (`layer_get_id("Tiles_Terreno")`), cualquier variación o error tipográfico en una sala (`Tiles_Piso`, `Terreno_1`) provocará que el código falle o no encuentre la superficie sólida.

Ejercicios prácticos

Realiza los siguientes tres ejercicios para consolidar la creación, diseño e inspección de mapas de mosaicos en tu proyecto:

**Ejercicio 1: Creación del recurso Tile Set con respeto a la celda cero** Crea un sprite llamado `spr_tileset_castillo` con dimensiones de 64x64 píxeles subdividido en celdas de 16x16 (una matriz de 4 columnas por 4 filas). Deja la celda superior izquierda (columna 0, fila 0) completamente transparente. Dibuja en las casillas contiguas bloques de ladrillo de piedra: un ladrillo con borde superior, un ladrillo con borde lateral y un ladrillo de relleno interior. Posteriormente crea el recurso Tile Set `tls_castillo`, asígnale el sprite y verifica que los tamaños de celda estén configurados exactamente en 16x16 píxeles. *Criterio de comprobación:* Al abrir `tls_castillo`, la primera casilla visible en la esquina superior izquierda debe tener el número 0 y fondo transparente; las demás piezas deben estar perfectamente encuadradas dentro de las líneas de la cuadrícula sin recortes ni desfases visuales.

**Ejercicio 2: Construcción de un escenario estructurado en capas** Abre la sala `rm_nivel_1`. Elimina o desactiva las instancias masivas de `obj_bloque` que servían de prueba inicial. Crea tres capas de mosaicos con los siguientes nombres: `Tiles_Fondo`, `Tiles_Terreno` y `Tiles_Decoracion`. Ordena las capas respetando la jerarquía visual frente a la capa `Instances`. Pinta un nivel que contenga al menos dos plataformas elevadas, una escalera de terreno y una cavidad subterránea con fondo estructural cerrado. *Criterio de comprobación:* En el Room Editor debes poder ocultar individualmente la capa `Tiles_Decoracion` o `Tiles_Fondo` (haciendo clic en el icono del ojo en la lista de capas) y ver cómo el escenario mantiene su estructura intacta sin que las texturas se pisen o borren entre sí.

**Ejercicio 3: Lector de información de celdas por depuración en GML** Amplía el código del evento Step de `obj_terreno_controller` para que, además de borrar baldosas con el clic izquierdo, al presionar la barra espaciadora (`keyboard_check_pressed(vk_space)`) lea la posición del jugador (`obj_jugador.x`, `obj_jugador.y`) e imprima en la consola de depuración mediante `show_debug_message()` el índice de la baldosa y las coordenadas de celda (columna y fila) que se encuentran exactamente debajo de los pies del jugador. *Criterio de comprobación:* Ejecuta el juego, mueve el personaje sobre diferentes sectores del nivel y presiona espacio. En la ventana de salida de GameMaker (Output) deben imprimirse mensajes legibles indicando la columna, fila e índice del tile detectado bajo el jugador.

Resumen

  • Sustituir miles de instancias de objetos de suelo por Tilemaps reduce drásticamente el consumo de memoria RAM y la sobrecarga de la CPU al consolidar el dibujado en una sola llamada por lote.
  • Un Tilemap requiere tres componentes vinculados: el Sprite fuente con las texturas, el recurso Tile Set que define la cuadrícula y la capa Tile Layer en la sala donde se pinta el escenario.
  • La celda superior izquierda (columna 0, fila 0) de todo conjunto de mosaicos está reservada por GameMaker como el índice 0 (vacío/transparente). Colocar gráficos útiles en esa posición impide su uso.
  • Estructurar los niveles en múltiples capas de mosaicos (fondo, terreno estructural, decoración y primer plano) resuelve el problema de superposición y aporta profundidad visual tridimensional.
  • A través de GML, funciones nativas como layer_tilemap_get_id(), tilemap_get_at_pixel() y tilemap_set_at_pixel() permiten inspeccionar, alterar y destruir baldosas de manera dinámica durante la partida.

Practica lo aprendido

Ejercicio 1 · 1 punto

¿Por qué motivo técnico es imprescindible dejar libre o transparente la casilla superior izquierda (columna 0, fila 0) al preparar un Tile Set en GameMaker?

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

Ejercicio 2 · 1 punto

Relaciona cada elemento fundamental del sistema de mosaicos de GameMaker con su definición correspondiente según la lección:

  • Sprite fuente
  • Recurso Tile Set
  • Capa de Tilemap (Tile Layer)
  • Herramienta Borrador (Eraser Tool)
Practicas sin cuenta: no se guarda nada. Regístrate para guardar tu progreso.

Ejercicio 3 · 1 punto

Siguiendo la regla de jerarquía visual explicada en la lección, ordena las siguientes capas en el panel del Room Editor de ARRIBA hacia ABAJO (de modo que los elementos se dibujen correctamente superpuestos de adelante hacia atrás):

  1. 1Capa de instancias (Instances)
  2. 2Capa de fondo (Background)
  3. 3Capa de mosaicos (Tiles_Terreno)
Practicas sin cuenta: no se guarda nada. Regístrate para guardar tu progreso.

Ingresa para guardar tu progreso — Ingresar