Estoy trabajando en un juego de rol 2D, que contará con los mapas habituales de mazmorras / ciudades (pregenerados).
Estoy usando fichas, que luego combinaré para hacer los mapas. Mi plan original era ensamblar los mosaicos usando Photoshop, o algún otro programa gráfico, para tener una imagen más grande que luego pudiera usar como mapa.
Sin embargo, he leído en varios lugares que la gente habla sobre cómo usaron matrices para construir su mapa en el motor (por lo que le da una matriz de mosaicos x a su motor y los ensambla como un mapa). Puedo entender cómo se hace, pero parece mucho más complicado de implementar, y no puedo ver las ventajas obvias.
¿Cuál es el método más común y cuáles son las ventajas / desventajas de cada uno?
Respuestas:
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.
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.
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 desdetl.X to br.X
y, en un bucle anidado, desdetl.Y to br.Y
para dibujarlos. Código de ejemplo a continuación: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.
Otros recursos del motor de azulejos
fuente
Tanto los sistemas basados en mosaicos como un modelo estático / sistema de textura se pueden usar para representar un mundo y cada uno tiene diferentes puntos fuertes. Si uno es mejor que el otro se reduce a cómo usa las piezas y qué funciona mejor para su conjunto de habilidades y necesidades.
Dicho esto, ambos sistemas se pueden usar por separado o también juntos.
Un sistema basado en mosaico estándar tiene las siguientes fortalezas:
La desventaja de los mosaicos es que debe crear un sistema para construir estos datos basados en mosaicos. Puede crear una imagen que use cada píxel como mosaico, creando así su matriz 2D a partir de una textura. También puede crear un formato propietario. Usando banderas de bits puede almacenar una gran cantidad de datos por mosaico en un espacio bastante pequeño.
La razón principal por la que la mayoría de las personas hacen mosaicos es porque les permite crear pequeños activos y reutilizarlos. Esto le permite crear una imagen mucho más grande con piezas más pequeñas. Reduce el retrabajo porque no está cambiando todo el mapa mundial para hacer un pequeño cambio. Por ejemplo, si quisieras cambiar la sombra de toda la hierba. En una imagen grande, tendrías que volver a pintar toda la hierba. En un sistema de mosaicos, simplemente actualiza los mosaicos de césped.
En general, es probable que haga mucho menos trabajo con un sistema basado en mosaicos que un gran mapa gráfico. Puede terminar usando un sistema basado en mosaicos para colisión, incluso si no lo usa para su mapa de tierra. El hecho de que use un mosaico internamente no significa que no pueda usar modelos para representar los objetos del entorno que pueden usar más de 1 mosaico para su espacio.
Debería proporcionar más detalles sobre su entorno / motor / idioma para proporcionar ejemplos de código.
fuente
Dibujar el mapa: los mosaicos son fáciles para el motor, porque entonces el mapa se puede representar como una matriz gigante de índices de mosaico. El código de dibujo es solo un bucle anidado:
Para mapas grandes, una imagen de mapa de bits enorme para todo el mapa podría ocupar mucho espacio en la memoria y podría ser más grande de lo que admite una tarjeta gráfica para un solo tamaño de imagen. Pero no tendrá problemas con los mosaicos porque solo asigna memoria gráfica una vez para cada mosaico (o un total, de manera óptima, si están todos en una hoja)
También es fácil reutilizar la información del mosaico para, por ejemplo, colisiones. por ejemplo, para obtener el mosaico del terreno en la esquina superior izquierda del sprite del personaje:
Suponga que necesita verificar colisiones contra rocas / árboles, etc. Puede obtener el mosaico en la posición de (posición del personaje + tamaño del sprite del personaje + dirección actual) y verificar si está marcado como transitable o no transitable.
fuente