Entonces, estoy haciendo un juego de rol HTML5 solo por diversión. El mapa es un <canvas>
(512 píxeles de ancho, 352 píxeles de alto | 16 cuadros de ancho, 11 cuadros de arriba a abajo). Quiero saber si hay una forma más eficiente de pintar <canvas>
.
Así es como lo tengo ahora.
Cómo se cargan y pintan los mosaicos en el mapa
El mapa se pinta con azulejos (32x32) usando la Image()
pieza. Los archivos de imagen se cargan a través de un for
bucle simple y se colocan en una matriz llamada tiles[]
para PINTAR al usar drawImage()
.
Primero, cargamos los azulejos ...
y así es como se está haciendo:
// 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, cuando un jugador comienza un juego, carga el mapa que dejó por última vez. Pero por aquí, es un mapa de toda la hierba.
En este momento, los mapas usan matrices 2D. Aquí hay un mapa de ejemplo.
[[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]];
Obtengo diferentes mapas usando una if
estructura simple . Una vez que la matriz 2d anterior es return
, el número correspondiente en cada matriz se pintará de acuerdo con el Image()
almacenado en el interior tile[]
. Luego drawImage()
ocurrirá y pintará de acuerdo con el x
y y
y el tiempo 32
para pintar en la x-y
coordenada correcta .
Cómo se produce el cambio de mapa múltiple
Con mi juego, mapas tienen cinco cosas a no perder de vista: currentID
, leftID
, rightID
, upID
, y bottomID
.
- currentID: la ID actual del mapa en el que se encuentra.
- leftID: qué ID
currentID
cargar para salir al salir a la izquierda del mapa actual. - rightID: qué ID de
currentID
cargar cuando sale a la derecha del mapa actual. - downID: qué ID de
currentID
cargar cuando salga en la parte inferior del mapa actual. - upID: qué ID de
currentID
cargar cuando sales en la parte superior del mapa actual.
Algo que nota: Si bien leftID
, rightID
, upID
, o bottomID
no son específicos, lo que significa que son una 0
. Eso significa que no pueden dejar ese lado del mapa. Es simplemente un bloqueo invisible.
Entonces, una vez que una persona sale de un lado del mapa, dependiendo de dónde salió ... por ejemplo, si salió en la parte inferior, bottomID
aparecerá el número de la map
carga y, por lo tanto, se pintará en el mapa.
Aquí hay un .GIF representativo para ayudarlo a visualizar mejor:
Como puede ver, tarde o temprano, con muchos mapas, trataré con muchas ID. Y eso posiblemente puede ser un poco confuso y agitado.
La ventaja obvia es que carga 176 mosaicos a la vez, actualiza un pequeño lienzo de 512x352 y maneja un mapa a la vez. La desventaja es que los identificadores de MAP, cuando se trata con muchos mapas, a veces pueden ser confusos.
Mi pregunta
- ¿Es esta una forma eficiente de almacenar mapas (dado el uso de mosaicos), o hay una mejor manera de manejar mapas?
Estaba pensando en la línea de un mapa gigante. El tamaño del mapa es grande y es todo un conjunto 2D. La ventana gráfica, sin embargo, sigue siendo 512x352 píxeles.
Aquí hay otro .gif que hice (para esta pregunta) para ayudar a visualizar:
Lo siento si no puedes entender mi inglés. Por favor, pregunte cualquier cosa que tenga problemas para entender. Con suerte, lo dejé claro. Gracias.