Последние несколько недель я пытался заставить код это работать с моим движком.
пока у меня загружается карта и все данные есть, набор тайлов загружен и разделен на тайлы.
Моя проблема в том, что когда я пытаюсь отобразить карту в своем игровом цикле, я получаю ошибку типа
Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLImageElement or SVGImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas)'
Я не понимаю, почему я получаю эту ошибку, потому что я рисую каждую плитку на элементе холста и превращаю его в изображение
вот мой код
export class TiledMap{
constructor(){
this.tilesets = [];
this.tiles = [];
this.map = null;
}
load(jsonFile){
let self = this;
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (xhr.readyState == 4 && xhr.status == 200){
self.parse(xhr.responseText);
}
}
xhr.open("GET",jsonFile,true);
xhr.send();
}
parse(json){
this.map = JSON.parse(json);
this.loadTilesetImages();
}
loadTilesetImages(){
let successCount = 0;
let errorCount = 0;
let self = this;
for(let ts=0; ts<this.map.tilesets.length; ts++){
let image = new Image();
image.addEventListener("load",function(){
successCount++;
if (successCount + errorCount == self.map.tilesets.length){
self.seperateTiles();
}
});
image.addEventListener("error",function(){
errorCount++;
alert("error loading: " + self.map.tilesets[ts].image);
});
image.src = this.map.tilesets[ts].image;
this.tilesets.push(image);
}
}
seperateTiles(){
let successCount = 0;
for(let ts=0; ts<this.tilesets.length; ts++){
let nTilesX = this.tilesets[ts].width / this.map.tilewidth;
let nTilesY = this.tilesets[ts].height / this.map.tileheight;
for(let ty=0; ty<nTilesY; ty++){
for(let tx=0; tx<nTilesX; tx++){
let tileCanvas = document.createElement("canvas");
let tileContext = tileCanvas.getContext("2d");
tileCanvas.width = this.map.tilewidth;
tileCanvas.height = this.map.tileheight;
let x = tx * this.map.tilewidth;
let y = ty * this.map.tileheight;
tileContext.drawImage(this.tilesets[ts],-x,-y);
let tile = new Image();
tile.src = tileCanvas.toDataURL("image/png");
this.tiles.push(tile);
}
}
}
}
drawTiles(){
for(let l=0; l < this.map.layers.length; l++){
let x=0;
let y=0;
if (this.map.layers[l].type === "tilelayer"){
for(let d=0; d < this.map.layers[l].data.length; d++){
if (d % this.map.width == 0 && d != 0){
y += this.map.tileheight;
x = 0;
}
if (this.map.layers[l].data[d] != 0){
engine["ctx"].drawImage(this.tiles[this.map.layers[l].data[d]],x,y);
}
x += this.map.tilewidth;
}
}
}
}
@Kaiido говорит, что изображение (this.tiled [this.map.layers [l] .data [d]) не определено, но когда я console.info в консоли браузера он возвращает тег изображения, это могло произойти, потому что изображение еще не загрузилось?
Нет, если он говорит, что он не определен, это потому, что он не был определен. Если бы он не был загружен, вы бы получили другое сообщение об ошибке. Но сначала нужно его определить.
хорошо, я не буду его отображать, пока он не обнаружит, что набор тайлов загружен, и теперь он отображает



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


При использовании console.info для просмотра того, что было за плиткой, он возвращал undefined, чтобы исправить это, я визуализировал карту только после того, как я узнал, что набор плиток завершил загрузку и был разделен на плитки. после этого все работало так, как ожидалось, а также исправлена ошибка в методе seperateTiles ().
Попробуйте передать
console.infoзначение, которое вы передаете вdrawImage.