Mapas de vista 2D de arriba hacia abajo

8

Me preguntaba cómo funciona esto.

¿Carga el mapa completo cuando se inicia el juego o carga partes del mapa en tiempo de ejecución?

¿Y cómo guardarías los mapas? ¿Sería en XML o en algún formato binario?

¡Gracias!

Kevin
fuente

Respuestas:

23

Estoy de acuerdo con eBusiness. Depende del tamaño y de cómo quiera editarlo.

Estima el tamaño de bytes de tu mapa en una representación razonablemente compacta. También decida qué partes del mapa pueden cambiar a medida que se juega. Las partes que no cambian pueden cargarse y no tienen que guardarse. Si el tamaño estimado es pequeño, simplemente almacene todo en la memoria. No vale la pena la complejidad adicional de cargar partes del mapa y rastrear lo que ha cargado o no, a menos que los datos sean tan grandes que sean necesarios.

Por ejemplo, si estaba escribiendo Civilization II , el tamaño de su mapa podría ser de 100x100 mosaicos.

  1. Cada mosaico es uno de los 12 tipos, por lo que puede almacenarlo en 4 bits. Eso significa que el mapa principal es 100 x 100 x 0.5 bytes = 5,000 bytes para almacenar los tipos de mosaico. El mapa principal nunca cambia.
  2. También puede mejorar los mosaicos del mapa con carreteras, riego, etc., y hay hasta 7 mejoras. Eso significa 2 ^ 7 valores diferentes, tomando 7 bits, pero probablemente solo usaríamos 1 byte para ello. Eso nos da 100 x 100 x 1 byte = 10,000 bytes para almacenar las mejoras.
  3. La niebla de guerra nos dice qué mosaicos de mapas has visto, por lo que necesitas 1 bit por jugador. Si limitas a 8 jugadores, ese es otro byte por mosaico de mapa, o 10,000 bytes para la niebla de guerra.
  4. Finalmente, están todas las ciudades y unidades. Puedes estimar que cada jugador tiene hasta 20 ciudades y 100 unidades, y cada una de estas puede requerir 100 bytes de datos (conjetura), por lo que son 12,000 bytes (mucho más si estás usando XML).

Eso es menos de 30k para una representación binaria compacta del mapa Civ II + objetos, por lo que puede almacenarlo todo en la memoria, incluso si usa un formato detallado que es mucho más grande. Obtuve los números anteriores de alguien que realizó ingeniería inversa en la estructura del mapa Civ II .

Daggerfall , que algunos consideran que tiene un mapa ridículamente grande, parece tener 5000x2500 y alrededor de 25 megabytes, pero también tiene una gran cantidad de NPC (750,000 es lo que he leído, pero eso parece muy alto). En las máquinas de escritorio / portátiles actuales, esto también podría caber en la memoria, pero en dispositivos móviles o navegadores que podrían ser demasiado grandes. Hay una wiki que describe el formato del mapa Daggerfall .

Puede reducir el tamaño identificando y factorizando la redundancia . Por ejemplo, en lugar de almacenar 100,000 árboles o espadas idénticos cada uno en formato XML, almacene un árbol y una espada y 100,000 referencias a ellos. En los formatos binarios, la referencia puede ser de solo 1 o 2 bytes, y en un formato más detallado, la referencia puede ser razonablemente pequeña.

Haz lo más simple que funcione para tu juego. Si el mapa es pequeño, no importa si usa un formato compacto o detallado. Si el formato compacto encajaría en la memoria pero el formato detallado no lo haría, debe decidir si el trabajo adicional del formato binario es más o menos que el trabajo adicional de cargar partes del mapa. Eso dependerá del juego. En un juego tipo Civ donde necesitas todos los datos para simular giros, el formato binario es probablemente una mejor opción. En un juego similar a Daggerfall donde no necesitas cargar áreas excepto lo que está cerca del jugador, cargar porciones del mapa es probablemente una mejor opción. Si el mapa es así grande, incluso si el formato compacto no cabe en la memoria, primero pregúntese si realmente vale la pena todo el trabajo extra para manejarlo, y si es así, diseñe un formato binario del que pueda cargar porciones.

Para mi proyecto actual (hobby), los mapas y todos los objetos en ellos caben en 50 MB, por lo que estaría bien mantenerlo todo en la memoria. Sin embargo, quiero que se ejecute en el navegador, y 50 MB es más de lo que quiero transferir a través de la red, por lo que los mantengo en la memoria en el servidor y luego cargo solo partes del mundo en el cliente. Mis mosaicos de mapa son 1 byte por mosaico, 2048x2048 mosaicos (4 MB). Los objetos (árboles, sillas, orcos, etc.) están codificados con JSON para simplificar. En el cliente solo cargo las áreas del mapa (incluidos sus objetos) que están cerca del jugador.

amitp
fuente
1
Gracias por una gran respuesta, ¡esto me ha aclarado todo! (PD, buena suerte con tu proyecto :)
Kevin
4

Cuánto cargar depende al menos de qué tan grande es el mapa, si los datos pueden caber razonablemente en la memoria, entonces no hay realmente ninguna razón para molestarse con la carga progresiva.

Lo más notable que hace XML es ocupar mucho espacio adicional de almacenamiento / memoria / espacio de red / tráfico. Si cree que usar XML es divertido, asegúrese de hacerlo solo para cantidades relativamente pequeñas de datos.

Cuando diseñe un formato de datos, debe tener en cuenta cómo desea editar estos datos. Puede usar un editor de texto simple para escribir sus datos como un archivo de texto sin formato, puede usar estos archivos directamente o puede convertirlos a un formato binario para ahorrar espacio. Podría usar un editor de imágenes para hacer sus niveles como mapas de bits, de nuevo, es posible que desee convertir a un archivo más pequeño.

O podría hacer su propio editor, en cuyo caso hay pocas razones para no usar un formato binario compacto.

aaaaaaaaaaaa
fuente
1

No hay una sola respuesta a estas preguntas. Todos estos son inherentemente de usted.

Puede guardar mapas de la forma que desee y mostrarlos / renderizarlos en cualquier momento.

Bryan Harrington
fuente
Agregaré una cosa más, las razones de rendimiento pueden hacer que cargues partes del mapa con el tiempo, pero creo que para la mayoría de los juegos prácticos realmente no importa a menos que lo desarrolles en dispositivos móviles.
Bryan Harrington
2
Esto puede ser cierto, pero podría haber sido bueno dar algunas formas generales de hacerlo.
El pato comunista
Si bien entiendo, solía estar en esa posición "¿Cómo hago 'esto'". Aprendí de la manera difícil en un curso de gráficos que tomé, necesitábamos implementar A * con una malla de navegación. Pasé horas investigando, leyendo e intentando buscar formas de hacerlo. Finalmente, nunca se hizo. ¿Qué lección aprendí? Debería haberlo hecho de la forma en que entendí cómo hacerlo antes de complicar mi cerebro con complicaciones.
Bryan Harrington