Quindi, sto realizzando un gioco di ruolo HTML5 solo per divertimento. La mappa è una <canvas>
(512 pixel di larghezza, 352 pixel di altezza | 16 tessere attraverso, 11 tessere dall'alto verso il basso). Voglio sapere se esiste un modo più efficiente di dipingere <canvas>
.
Ecco come lo ho adesso.
Come le tessere vengono caricate e dipinte sulla mappa
La mappa viene dipinta da tessere (32x32) usando il Image()
pezzo. I file di immagine vengono caricati attraverso un semplice for
ciclo e inseriti in un array chiamato tiles[]
per essere DIPINTO durante l'utilizzo drawImage()
.
Innanzitutto, cariciamo le tessere ...
ed ecco come viene fatto:
// SET UP THE & DRAW THE MAP TILES
tiles = [];
var loadedImagesCount = 0;
for (x = 0; x <= NUM_OF_TILES; x++) {
var imageObj = new Image(); // new instance for each image
imageObj.src = "js/tiles/t" + x + ".png";
imageObj.onload = function () {
console.log("Added tile ... " + loadedImagesCount);
loadedImagesCount++;
if (loadedImagesCount == NUM_OF_TILES) {
// Onces all tiles are loaded ...
// We paint the map
for (y = 0; y <= 15; y++) {
for (x = 0; x <= 10; x++) {
theX = x * 32;
theY = y * 32;
context.drawImage(tiles[5], theY, theX, 32, 32);
}
}
}
};
tiles.push(imageObj);
}
Naturalmente, quando un giocatore inizia una partita, carica la mappa che ha interrotto l'ultima volta. Ma per qui, è una mappa tutta erba.
Al momento, le mappe usano array 2D. Ecco una mappa di esempio.
[[4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 1, 1, 1],
[1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 1],
[1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1]];
Ricevo diverse mappe usando una if
struttura semplice . Una volta che l'array 2d sopra è return
, il numero corrispondente in ciascun array verrà dipinto secondo l' Image()
archiviazione interna tile[]
. Quindi drawImage()
si verificherà e dipingerà in base al x
e y
e volte 32
per dipingere sulla x-y
coordinata corretta .
Come si verifica la commutazione di più mappe
Con il mio gioco, mappe hanno cinque cose da tenere traccia di: currentID
, leftID
, rightID
, upID
, e bottomID
.
- currentID: l'ID corrente della mappa in cui ti trovi.
- leftID: quale ID
currentID
caricare quando esci a sinistra della mappa corrente. - rightID: quale ID
currentID
caricare quando esci sulla destra della mappa corrente. - downID: quale ID
currentID
caricare quando esci nella parte inferiore della mappa corrente. - upID: quale ID
currentID
caricare quando esci nella parte superiore della mappa corrente.
Qualcosa da Nota: Se uno dei due leftID
, rightID
, upID
, o bottomID
non sono specifici, che significa che sono una 0
. Ciò significa che non possono lasciare quel lato della mappa. È semplicemente un blocco invisibile.
Quindi, una volta che una persona esce da un lato della mappa, a seconda di dove è uscita ... per esempio se è uscita in fondo, bottomID
il numero del map
da caricare sarà quindi dipinto sulla mappa.
Ecco un .GIF rappresentativo per aiutarti a visualizzare meglio:
Come puoi vedere, prima o poi, con molte mappe mi occuperò di molti ID. E questo può forse diventare un po 'confuso e frenetico.
I vantaggi ovvi è che carica 176 tessere alla volta, aggiorna una piccola tela 512x352 e gestisce una mappa alla volta. L'aspetto negativo è che gli ID MAP, quando hanno a che fare con molte mappe, a volte possono creare confusione.
La mia domanda
- È un modo efficiente per memorizzare le mappe (dato l'uso delle tessere) o esiste un modo migliore per gestire le mappe?
Stavo pensando sulla falsariga di una gigantesca mappa. La dimensione della mappa è grande ed è tutta una matrice 2D. Il viewport, tuttavia, è ancora 512x352 pixel.
Ecco un altro .gif che ho creato (per questa domanda) per aiutare a visualizzare:
Scusa se non riesci a capire il mio inglese. Per favore, chiedi qualsiasi cosa tu abbia difficoltà a capire. Spero di averlo chiarito. Grazie.