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