Итак, я делаю 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, который я сделал (для этого вопроса), чтобы помочь визуализировать:
Извините, если вы не понимаете мой английский. Пожалуйста, спросите все, что у вас есть проблемы с пониманием. Надеюсь, я дал понять. Благодарю.