Então, eu estou fazendo um RPG HTML5 apenas por diversão. O mapa é um <canvas>
(largura de 512 px, altura de 352 px | 16 blocos de largura, 11 blocos de cima para baixo). Quero saber se existe uma maneira mais eficiente de pintar o <canvas>
.
Aqui está como eu o tenho agora.
Como os blocos são carregados e pintados no mapa
O mapa está sendo pintado por azulejos (32x32) usando a Image()
peça. Os arquivos de imagem são carregados através de um for
loop simples e colocados em uma matriz chamada tiles[]
PAINTED ao usar drawImage()
.
Primeiro, carregamos os ladrilhos ...
e aqui está como está sendo feito:
// 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 um jogador inicia um jogo, ele carrega o mapa que ele deixou por último. Mas por aqui, é um mapa de grama.
No momento, os mapas usam matrizes 2D. Aqui está um exemplo de mapa.
[[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]];
Recebo mapas diferentes usando uma if
estrutura simples . Uma vez que o 2d array acima seja return
, o número correspondente em cada array será pintado de acordo com o Image()
armazenado no interior tile[]
. Em seguida, drawImage()
irá ocorrer e pintar de acordo com o x
e y
e vezes por 32
pintar na correta x-y
coordenadas.
Como ocorre a troca de mapas múltiplos
Com o meu jogo, mapas têm cinco coisas para manter o controle de: currentID
, leftID
, rightID
, upID
, e bottomID
.
- currentID: O ID atual do mapa em que você está.
- leftID: qual ID de
currentID
carregar quando você sai à esquerda do mapa atual. - rightID: qual ID de
currentID
carregar quando você sai à direita do mapa atual. - downID: qual ID de
currentID
carregar quando você sai na parte inferior do mapa atual. - upID: qual ID de
currentID
carregar quando você sai na parte superior do mapa atual.
Algo a nota: Se qualquer um leftID
, rightID
, upID
, ou bottomID
não são específicos, isso significa que eles são um 0
. Isso significa que eles não podem sair desse lado do mapa. É apenas um bloqueio invisível.
Assim, uma vez que uma pessoa sai de um lado do mapa, dependendo de onde saiu ... por exemplo, se saiu na parte inferior, bottomID
será o número do map
carregamento a ser carregado e, assim, será pintado no mapa.
Aqui está um .GIF representacional para ajudá-lo a visualizar melhor:
Como você pode ver, mais cedo ou mais tarde, com muitos mapas, lidarei com muitos IDs. E isso pode ficar um pouco confuso e agitado.
Os profissionais óbvios são que ele carrega 176 blocos de cada vez, atualiza uma pequena tela de 512x352 e manipula um mapa de cada vez. A desvantagem é que os IDs do MAP, ao lidar com muitos mapas, podem ficar confusos às vezes.
Minha pergunta
- É uma maneira eficiente de armazenar mapas (dado o uso de blocos) ou existe uma maneira melhor de lidar com mapas?
Eu estava pensando nas linhas de um mapa gigante. O tamanho do mapa é grande e é uma matriz 2D. A janela de exibição, no entanto, ainda tem 512x352 pixels.
Aqui está outro .gif que eu fiz (para esta pergunta) para ajudar a visualizar:
Desculpe se você não consegue entender meu inglês. Por favor, pergunte qualquer coisa que você tenha problemas para entender. Felizmente, deixei claro. Obrigado.