#javascript #html5-canvas
#javascript #html5-холст
Вопрос:
Вот код, который я использую прямо сейчас, чтобы попытаться сгенерировать tilemap:
// --- Javascript ---
window.onload = function (){
var can = document.getElementById("canvas");
var ctx = can.getContext('2d');
var map = {
cols: 8, //# of cols
rows: 8, // # of rows
tSize: 32, // tile size (32px x 32px)
tiles: [
[1, 1, 1, 1 ,1 ,1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]
], // map
};
var tileAtlas = new Image();
tileAtlas.src = 'Tiles.png';
tileAtlas.onload = function () {
for (var c = 0; c < map.cols; c ) {
for (var r = 0; r < map.rows; r ) {
if (map.tiles[c][r] !== 0) { // 0 is an empty tile
ctx.drawImage(
tileAtlas, // image
map.tiles[c][r] * 32, // cut start x
0, // cut start y
map.tsize, // size of tiles for cut size x
map.tsize, // size of tiles for cut size y
c * map.tsize, // place tiles on canvas x
r * map.tsize, // place tiles on canvas y
map.tsize, // place height
map.tsize // place width
);
}
}
}
}
}
вот таблица спрайтов
Предполагалось, что на нем будет отображаться сетка «травы» размером 8х8, но она была пустой, хотя консоль была чистой
Комментарии:
1. Что касается строки
if (1 !== 0) { // 0 is an empty tile
, это фактический код, который вы используете прямо сейчас, или была опечатка при копировании кода?2.
tsize
иtSize
— это не одно и то же.3. извините, нет, это было для того, чтобы попробовать отладку, потому что все это не было пустым пространством, поэтому я просто сделал это всегда верным. это
if(tiles[c][r] !== 0){ // 0 is an empty tile
4. Пожалуйста, отредактируйте свой код в вопросе, чтобы включить это исправление @Gamecocks20048
Ответ №1:
Вы неправильно написали tsize
(против tSize
). Кроме того, выражение для второго аргумента кажется не тем, что вы хотите. Вы можете просто передать 0:
ctx.drawImage(
tileAtlas, // image
0,
0,
map.tSize, // size of tiles for cut size x
map.tSize, // size of tiles for cut size y
c * map.tSize, // place tiles on canvas x
r * map.tSize, // place tiles on canvas y
map.tSize, // place height
map.tSize // place width
);
var can = document.getElementById("canvas");
var ctx = can.getContext('2d');
var map = {
cols: 8, //# of cols
rows: 8, // # of rows
tSize: 32, // tile size (32px x 32px)
tiles: [
[1, 1, 1, 1 ,1 ,1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]
], // map
};
var tileAtlas = new Image();
tileAtlas.src = 'https://i.stack.imgur.com/2JX3d.png';
tileAtlas.onload = function () {
for (var c = 0; c < map.cols; c ) {
for (var r = 0; r < map.rows; r ) {
ctx.drawImage(
tileAtlas, // image
0,
0,
map.tSize, // size of tiles for cut size x
map.tSize, // size of tiles for cut size y
c * map.tSize, // place tiles on canvas x
r * map.tSize, // place tiles on canvas y
map.tSize, // place height
map.tSize // place width
);
}
}
}
<canvas id="canvas" width="256px" height="256px"></canvas>
Комментарии:
1. Это очень близко к тому, что я искал, но я хочу только 1-й элемент, а не всю картинку, поэтому трава перед спрайтом грязи
2. Итак, затем передайте в качестве второго и третьего аргумента ноль. Обновленный ответ соответствующим образом.