Я озадачен тем, что, вероятно, довольно простая математика.Мне нужно получить координаты X и Y из каждого идентификатора, на который ссылаются плитки.Сетка ниже показывает порядок, в котором генерируются идентификаторы. Каждая плитка имеет ширину и высоту 32. Числовые единицы x & y будут равны (0,0).Это для игры, которую я начинаю делать с canvas, используя tileset.
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9
Пока что для X я придумал ...
(n % 3) * 32 - 32
// 3 - ширина исходного изображения, деленная на 32
И для Y ...
(n / 3) * 32
Это, очевидно, неправильноНо это самое близкое, что я достиг, и я не думаю, что я слишком далек от фактической формулы.
Вот мой настоящий код:
function startGame() {
const canvas = document.getElementById("rpg");
const ctx = canvas.getContext("2d");
const tileSet = new Image();
tileSet.src = "dungeon_tiles.png";
let map = {
cols: 10,
rows: 10,
tsize: 32,
getTileX: function(counter, tiles) {
return ((tiles[counter] - 1) % 64) * 32;
},
getTileY: function(counter, tiles) {
return ((tiles[counter] - 1) / 64) * 32;
}
};
let counter = 0;
tileSet.onload = function() {
for (let c = 0; c < map.cols; c++) {
for (let r = 0; r < map.rows; r++) {
let x = map.getTileX(counter, mapObj.layers[0].data); // mapObj.layers[0].data is the array of values
let y = map.getTileY(counter, mapObj.layers[0].data);
counter += 1;
ctx.drawImage(
tileSet, // image
x, // source x
y, // source y
map.tsize, // source width
map.tsize, // source height
r * map.tsize, // target x
c * map.tsize, // target y
map.tsize, // target width
map.tsize // target height
);
}
}
};
}