Итак, я делаю HTML5 RPG просто для удовольствия. Карта представляет собой <canvas>(ширина 512 пикселей, высота 352 пикселя | 16 плиток в поперечнике, 11 плиток сверху вниз). Я хочу знать, есть ли более эффективный способ рисовать <canvas>.
Вот как у меня это сейчас.
Как плитки загружены и нарисованы на карте
Карта рисуется плиткой (32х32) с использованием Image()фигуры. Файлы изображений загружаются через простой forцикл и помещаются в массив, вызываемый tiles[]для использования при рисовании drawImage().
Сначала мы загружаем плитки ...

и вот как это делается:
// 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);
}
Естественно, когда игрок начинает игру, он загружает карту, которую он в последний раз остановил. Но здесь, это карта всех трав.
Прямо сейчас, карты используют 2D-массивы. Вот пример карты.
[[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]];
Я получаю разные карты, используя простую ifструктуру. Как только 2d массив выше return, соответствующий номер в каждом массиве будет окрашен в соответствии с Image()сохраненным внутри tile[]. Затем drawImage()произойдет и закрасить в соответствии с xи yи раз его, 32чтобы закрасить по правильной x-yкоординате.
Как происходит многократное переключение карт
С моей игры, карты есть пять вещей , чтобы следить за: currentID, leftID, rightID, upID, и bottomID.
- currentID: текущий идентификатор карты, на которой вы находитесь.
- leftID: какой идентификатор
currentIDзагружать при выходе слева от текущей карты. - rightID: какой идентификатор
currentIDзагружать при выходе справа от текущей карты. - downID: какой идентификатор
currentIDзагружать при выходе из нижней части текущей карты. - upID: какой идентификатор
currentIDзагружать при выходе из верхней части текущей карты.
Что - то Примечание: Если какая- либо leftID, rightID, upIDили bottomIDне являются специфичными, это означает , что они являются 0. Это означает, что они не могут покинуть эту сторону карты. Это просто невидимая блокада.
Таким образом, как только человек выходит из стороны карты, в зависимости от того, где он вышел ... например, если он вышел из нижней части, bottomIDбудет номер mapзагрузки и, таким образом, будет отображаться на карте.
Вот представительный .GIF, чтобы помочь вам лучше визуализировать:

Как вы можете видеть, рано или поздно со многими картами я буду иметь дело со многими идентификаторами. И это может стать немного запутанным и беспокойным.
Очевидным плюсом является то, что он загружает 176 плиток за раз, обновляет небольшой холст 512x352 и обрабатывает одну карту за раз. Дело в том, что идентификаторы MAP при работе со многими картами могут иногда сбивать с толку.
Мой вопрос
- Это эффективный способ хранения карт (с учетом использования листов) или есть лучший способ обработки карт?
Я думал по линии гигантской карты. Размер карты большой, и все это один массив 2D. Однако область просмотра по-прежнему составляет 512x352 пикселей.
Вот еще один .gif, который я сделал (для этого вопроса), чтобы помочь визуализировать:

Извините, если вы не понимаете мой английский. Пожалуйста, спросите все, что у вас есть проблемы с пониманием. Надеюсь, я дал понять. Благодарю.