Mappe di visualizzazione 2D dall'alto verso il basso


8

Mi chiedevo come funzionasse.

Carichi la mappa completa all'avvio del gioco o carichi parti della mappa in fase di esecuzione?

E come salveresti le mappe? Sarebbe in XML o in qualche formato binario?

Grazie!

Risposte:


23

Sono d'accordo con eBusiness. Dipende dalle dimensioni e da come si desidera modificarlo.

Stimare la dimensione in byte della mappa in una rappresentazione ragionevolmente compatta. Decidi anche quali parti della mappa possono cambiare durante il gioco. Le parti che non cambiano possono essere caricate e non devono essere salvate. Se la dimensione stimata è ridotta, è sufficiente archiviare tutto in memoria. Non vale la complessità extra del caricamento di parti della mappa e del monitoraggio di ciò che hai caricato o meno, a meno che i dati non siano così grandi da essere necessari.

Ad esempio, se stavi scrivendo Civilization II , la dimensione della tua mappa potrebbe essere di 100x100 tessere.

  1. Ogni riquadro è di 12 tipi, quindi puoi memorizzarlo in 4 bit. Ciò significa che la mappa principale è 100 x 100 x 0,5 byte = 5.000 byte per memorizzare i tipi di tessere. La mappa principale non cambia mai.
  2. Puoi anche migliorare le tessere cartografiche con strade, irrigazione, ecc., E ci sono fino a 7 miglioramenti. Ciò significa 2 ^ 7 valori diversi, prendendo 7 bit, ma probabilmente utilizzeremmo solo 1 byte. Questo ci dà 100 x 100 x 1 byte = 10.000 byte per memorizzare i miglioramenti.
  3. La nebbia della guerra ci dice quali tessere mappa hai visto, quindi hai bisogno di 1 bit per giocatore. Se limiti a 8 giocatori, questo è un altro byte per tessera mappa, o 10.000 byte per la nebbia della guerra.
  4. Infine, ci sono tutte le città e le unità. Potresti stimare che ogni giocatore ha fino a 20 città e 100 unità, e ognuna di queste potrebbe richiedere 100 byte di dati (ipotesi selvaggia), quindi sono 12.000 byte (molto di più se stai usando XML).

Questo è inferiore a 30k per una rappresentazione binaria compatta della mappa + oggetti di Civ II, quindi puoi archiviarli tutti in memoria, anche se usi un formato dettagliato molto più grande. Ho ottenuto i numeri precedenti da qualcuno che ha invertito la struttura della mappa di Civ II .

Daggerfall , considerato da alcuni come una mappa ridicolmente grande, sembra essere 5000x2500 e circa 25 megabyte, ma ha anche un gran numero di NPC (750.000 è quello che ho letto ma sembra molto alto). Sulle macchine desktop / laptop di oggi anche questo potrebbe adattarsi alla memoria, ma su dispositivi mobili o browser che potrebbero essere un po 'troppo grandi. C'è una wiki che descrive il formato della mappa Daggerfall .

È possibile ridurre le dimensioni identificando e prendendo in considerazione la ridondanza . Ad esempio, invece di archiviare 100.000 alberi o spade identici ciascuno in un formato XML, memorizza un albero e una spada e 100.000 riferimenti ad essi. Nei formati binari quel riferimento potrebbe essere solo 1 o 2 byte, e in un formato più dettagliato il riferimento può ancora essere ragionevolmente piccolo.

Fai la cosa più semplice che funziona per il tuo gioco. Se la mappa è piccola, non importa se si utilizza un formato compatto o dettagliato. Se il formato compatto si adatterà alla memoria ma il formato dettagliato no, devi decidere se il lavoro extra del formato binario è più o meno del lavoro extra del caricamento di porzioni della mappa. Dipenderà dal gioco. In un gioco in stile Civ in cui sono necessari tutti i dati per simulare i turni, il formato binario è probabilmente una scelta migliore. In un gioco simile a Daggerfall in cui non è necessario caricare aree tranne ciò che è vicino al giocatore, caricare porzioni della mappa è probabilmente una scelta migliore. Se la mappa è così grande che anche il formato compatto non si adatta alla memoria, quindi chiediti prima se vale davvero la pena lavorare in più e, in tal caso, progetta un formato binario di cui puoi caricare parti.

Per il mio attuale progetto (hobby), le mappe e tutti gli oggetti su di esse si adattano a 50 MB, quindi tenere tutto in memoria andrebbe bene. Tuttavia, voglio che venga eseguito nel browser e 50 MB sono più di quelli che voglio trasferire sulla rete, quindi li tengo tutti in memoria sul server e quindi carico solo parti del mondo nel client. Le tessere della mia mappa sono 1 byte per tessera, tessere 2048x2048 (4 MB). Gli oggetti (alberi, sedie, orchi, ecc.) Sono codificati JSON per semplicità. Nel client carico solo le aree della mappa (compresi i loro oggetti) che si trovano vicino al giocatore.


1
Grazie per un'ottima risposta, questo mi ha chiarito molto! (PS buona fortuna con il tuo progetto :)
Kevin,

4

Quanto caricare dipende almeno da quanto è grande la mappa, se i dati possono ragionevolmente adattarsi alla memoria, non c'è davvero motivo di preoccuparsi del caricamento progressivo.

La cosa più notevole che XML fa è occupare molto spazio di archiviazione / memoria / spazio di rete / traffico. Se pensi che usare XML sia divertente, assicurati di farlo solo per quantità relativamente piccole di dati.

Quando si progetta un formato di dati, è necessario tenere presente come si desidera modificare questi dati. È possibile utilizzare un semplice editor di testo per scrivere i dati come un semplice file di testo, è possibile utilizzare direttamente questi file o convertirli in un formato binario per risparmiare spazio. Puoi usare un editor di immagini per rendere i tuoi livelli come bitmap, ancora una volta, potresti voler convertire in un file più piccolo.

Oppure potresti creare il tuo editor, nel qual caso ci sono poche ragioni per non usare un formato binario compatto.


1

Non c'è una risposta a queste domande. Questi sono tutti intrinsecamente da te.

Puoi salvare le mappe come preferisci e visualizzarle / renderizzarle in qualsiasi momento.


Aggiungerò un'altra cosa, i motivi delle prestazioni potrebbero farti caricare pezzi della mappa nel tempo, ma penso che per la maggior parte dei giochi pratici non importa davvero a meno che non ti sviluppi su dispositivi mobili.
Bryan Harrington,

2
Questo può essere vero, ma avrebbe potuto essere bello dare alcuni modi generali per farlo.
Il comunista Duck il

Mentre capisco, ero in quella posizione "Come faccio a 'questo'". Ho imparato a mie spese in un corso di grafica che ho seguito, dovevamo implementare A * con una mesh di navigazione. Ho trascorso ore a cercare, leggere e cercare di trovare modi per farlo. Alla fine, non è mai stato fatto. Che lezione ho imparato? Avrei dovuto farlo nel modo in cui ho capito come farlo prima di contorto il mio cervello con complicazioni.
Bryan Harrington,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.