2010-09-27 14 views
6

Sto creando un gioco di piattaforma in JavaScript utilizzando canvas che è interamente basato su tile. Qual è il metodo migliore per archiviare i blocchi di oggetti nel gioco (muri, pavimenti, oggetti)? Il fatto è che ogni tessera può essere distrutta o creata.Struttura dati per livelli nei giochi

Attualmente ho un array 2D, quindi sono in grado di verificare rapidamente se un articolo è in una posizione specifica di X & Y. Il problema con questo è quando l'utente si sposta e la mappa deve scorrere, ho bisogno di riassegnare ogni blocco. E cosa succede quando l'articolo è x = 0? Non posso usare indici negativi.

Preferisco l'analogo a scorrimento come a una piastrella alla volta. Inoltre pianifico di generare mappe in modo casuale man mano che l'utente si sposta e se non è stato generato in precedenza. Quindi, una volta generata qualcosa, dovrebbe rimanere così per sempre.

Un altro punto che dovrei menzionare è che sarà anche multiplayer. Quindi lo smantellamento dello schermo è una grande idea finché i dati nella cache non si sporcano e devono essere aggiornati dal database. Gah sono così nuovo per tutto questo; sembra impossibile, qualsiasi aiuto è molto apprezzato.

+0

è la vostra piattaforma infinitamente largo sulla asse x? Perché hai un problema con x = 0? Dovresti solo bloccare lo scorrimento a sinistra in quel caso? –

+1

Scopri http://www.youtube.com/watch?v=_RRnyChxijA – Sharun

+0

è infinito. L'utente dovrebbe essere in grado di tornare indietro a sinistra con le stesse tessere. – Louis

risposta

4

Dato che i livelli sono infiniti suggerirei una struttura simile a quella che hai già, con un leggero aggiustamento.

Invece di archiviare tutto in un unico grande array e spostare elementi all'interno di quell'array ogni volta che l'utente si sposta (ahi), invece, memorizza 9 blocchi di mappa (ciascuno di una dimensione tale da essere circa il doppio delle dimensioni dello schermo) quando l'utente si avvicina al bordo del frammento corrente, elimina i pezzi che sono fuori schermo, sposta tutti i pezzi a sinistra e carica quelli nuovi nello spazio vuoto.

Speriamo che questo era chiaro, ma solo nel caso, ecco uno schema:

Chunking

Le piazze da lettere sono i pezzi di carta, e il quadrato rosso è la finestra (ho disegnato leggermente troppo grande , ricorda che il viewport è più piccolo dei quadrati neri). Quando il viewport si sposta a destra, si scaricano i blocchi A B e C, si spostano tutti gli altri a sinistra e si caricano i nuovi dati in quelli più a destra. Poiché un chunk è il doppio della larghezza dello schermo, hai il tempo che impiega l'utente per attraversare lo schermo per generare/caricare il livello in quei blocchi. Se l'utente si muove velocemente nel mondo, puoi avere un set 4x4 di blocchi per il buffering extra.

Per indirizzare il ritorno a blocchi precedenti di mappa.ci sono un paio di modi per farlo:

  • scrivere i pezzi sul disco rigido quando non sono più in uso (o qualunque sia l'equivalente sarebbe in javascript)
  • espandere il vostro pezzo set infinitamente in memoria. Piuttosto che una serie di blocchi hanno un array assosciative che prende la posizione x/y del blocco e restituisce il blocco (o null, che indica che l'utente non è mai stato qui prima e che è necessario generarlo).
  • procedurale generare i livelli, che è complesso, ma significa che una volta che un pezzo si spegne schermo si può solo smaltire esso, ed essere sicuri che rigenera esattamente la stessa cosa di nuovo pezzo dopo
1

Ci sono ovviamente molti modi per farlo.

Se i livelli non sono troppo grandi, è possibile mantenere il progetto originale di un array 2D e utilizzare una variabile per memorizzare la posizione di scorrimento x/y corrente. Ciò significa che si memorizzano tutte le informazioni della mappa in memoria in ogni momento e si accede solo alle parti che è necessario visualizzare sullo schermo.

Quando si dipinge si individua quale tessera è visibile alla posizione di scorrimento corrente x/y, quante tessere si adattano allo schermo con la larghezza dello schermo corrente e dipingono solo quelle di cui si ha bisogno.

Se si scorrono le tessere intere alla volta, è piuttosto facile. Se è uno scorrimento più analogico, avrai bisogno di un controllo più preciso del punto in cui la tessera inizia a disegnare, oppure puoi imbrogliare e disegnare l'intera serie di tessere su una bitmap in memoria e poi blittare quella nell'area di disegno con un negativo compensare.

1

una volta ho definito questa stessa cosa in XML e JSON ... Penso che la serializzazione JSON sarebbe molto più veloce ed efficiente (per non dire facile) con cui lavorare in JavaScript, soprattutto perché JSON si presta così bene agli elenchi di lunghezza variabile come si richiederebbe per i livelli "N" in ogni gioco.

utilizzo di un formato standard potrebbe anche rendere più riutilizzabile e (idealmente) incoraggiare una maggiore collaborazione (se è quello che stai cercando). Puoi controllare il mio primo tentativo di creare un Video Game schema for level structure.

Come fileoffset dice, ci sono molti modi per farlo, ma consiglio vivamente mantenere i vostri dati di livello (cioè concetti), lontano dal di rendering (ad esempio oggetti in movimento, percorsi, velocità, tempi, x/y/z co -ordinamento di posizione, ecc ...).

Anche in questo caso, l'articolo dice che l'area è la più veloce e non si sa se WebGL, SMIL + SVG, Canvas + Javascript, buon vecchio Flash/Actionscript o qualcos'altro saranno il percorso migliore per te, in base alle tue esigenze e al tipo di gioco che stai sviluppando.

Problemi correlati