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 forciclo 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 ifstruttura 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 xe ye volte 32per dipingere sulla x-ycoordinata 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
currentIDcaricare quando esci a sinistra della mappa corrente. - rightID: quale ID
currentIDcaricare quando esci sulla destra della mappa corrente. - downID: quale ID
currentIDcaricare quando esci nella parte inferiore della mappa corrente. - upID: quale ID
currentIDcaricare quando esci nella parte superiore della mappa corrente.
Qualcosa da Nota: Se uno dei due leftID, rightID, upID, o bottomIDnon 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, bottomIDil numero del mapda 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.