En primer lugar, permítanme decir que los juegos de rol en 2D son cercanos y queridos por mi corazón y que trabajan con viejos motores DX7 VB6 MORPG (no se rían, fue hace 8 años, ahora :-)) es lo que primero me interesó en el desarrollo del juego . Más recientemente, comencé a convertir un juego en el que trabajé en uno de esos motores para usar XNA.
Dicho esto, mi recomendación es que use una estructura basada en mosaicos con capas para su mapa. Con cualquier API de gráficos que use, tendrá un límite en el tamaño de las texturas que puede cargar. Sin mencionar los límites de memoria de textura de la tarjeta gráfica. Entonces, teniendo en cuenta esto, si desea maximizar el tamaño de sus mapas y no solo minimizar la cantidad y el tamaño de las texturas que carga en la memoria, sino también disminuir el tamaño de sus activos en el disco duro del usuario Y los tiempos de carga, está definitivamente va a querer ir con azulejos.
En cuanto a la implementación, he entrado en detalles sobre cómo lo manejé en algunas preguntas aquí en GameDev.SE y en mi blog (ambos enlazados a continuación), y eso no es exactamente lo que estás preguntando, así que simplemente entra en lo básico aquí. También tomaré nota de las características de los mosaicos que los hacen beneficiosos al cargar varias imágenes grandes renderizadas previamente. Si algo no está claro, hágamelo saber.
- Lo primero que debe hacer es crear una hoja de mosaico. Esta es solo una imagen grande que contiene todos sus mosaicos alineados en una cuadrícula. Esto (y tal vez uno adicional dependiendo del número de mosaicos) será lo único que necesitará cargar. ¡Solo 1 imagen! Puedes cargar 1 por mapa o uno con cada mosaico en el juego; cualquier organización que trabaje para usted.
- A continuación, debe comprender cómo puede tomar esa "hoja" y traducir cada mosaico en un número. Esto es bastante sencillo con algunas matemáticas simples. Tenga en cuenta que la división aquí es la división de enteros , por lo que los decimales se eliminan (o se redondean hacia abajo, si lo prefiere).
Bien, ahora que ha dividido la hoja de mosaico en una serie de celdas (números), puede tomar esos números y conectarlos al contenedor que desee. En aras de la simplicidad, puede usar una matriz 2D.
int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
A continuación, quieres dibujarlos. Una de las formas en que puede hacer que esto sea MUCHO más eficiente (dependiendo del tamaño del mapa) es calcular solo las celdas que la cámara está viendo actualmente y recorrerlas. Puede hacer esto buscando las coordenadas de la matriz de mosaico del mapa de las esquinas superior izquierda ( tl
) e inferior derecha ( br
) de la cámara . Luego haga un bucle desde tl.X to br.X
y, en un bucle anidado, desde tl.Y to br.Y
para dibujarlos. Código de ejemplo a continuación:
for (int x = tl.X; x <= br.X;x++) {
for (int y = tl.Y; y <= br.Y;y++) {
//Assuming tileset setup from image
Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
//Draw 32x32 tile using tilesetCoordinate as the source x,y
}
}
- ¡Bote! Eso es lo básico del motor de azulejos. Puede ver que es fácil tener incluso un mapa de 1000x1000 con poca sobrecarga. Además, si tiene menos de 255 mosaicos, puede usar una matriz de bytes que reduce la memoria en 3 bytes por celda. Si un byte es demasiado pequeño, un ushort probablemente sea suficiente para sus necesidades.
Nota: omití el concepto de coordenadas mundiales (que es en lo que se basará la posición de su cámara) ya que creo que está fuera del alcance de esta respuesta. Puedes leer sobre eso aquí en GameDev.SE.
Mis recursos de Tile-Engine
Nota: Todos estos están dirigidos a XNA, pero se aplica prácticamente a cualquier cosa: solo necesita cambiar las llamadas de extracción.
- Mi respuesta a esta pregunta describe cómo manejo las celdas del mapa y las capas en mi juego. (Ver tercer enlace).
- Mi respuesta a esta pregunta explica cómo almaceno los datos en formato binario.
- Esta es la primera publicación de blog (bueno, técnicamente segunda, pero primera "técnica") sobre el desarrollo del juego en el que estaba trabajando. Toda la serie contiene información sobre cosas como sombreadores de píxeles, iluminación, comportamientos de mosaico, movimiento y todas esas cosas divertidas. De hecho, actualicé la publicación para incluir el contenido de mi respuesta al primer enlace que publiqué anteriormente, por lo que es posible que desee leerla en su lugar (es posible que haya agregado cosas). Si tiene alguna pregunta, puede dejar un comentario allí o aquí y con gusto lo ayudaré.
Otros recursos del motor de azulejos
- El tutorial del motor de mosaico de este sitio me dio la base que usé para crear mis mapas.
- Todavía no he visto estos tutoriales en video porque no he tenido tiempo, pero probablemente sean útiles. :) Sin embargo, pueden estar desactualizados si estás usando XNA.
- Este sitio tiene algunos tutoriales más que (creo) se basan en los videos anteriores. Puede valer la pena echarle un vistazo.