我有一个主要的javascript文件,它试图将tilemap绘制到游戏的画布上,我有一个实际绘制地图等的包含文件,但是我在firebug中得到了这个错误:
TypeError:无法将值转换为以下任何值:HTMLImageElement,HTMLCanvasElement,HTMLVideoElement。 [打破此错误]
ctx.drawImage(mapTiles[map[x][y]],x*tilesize, y*tilesize);
调用我的level.js文件的主要js如下所示:
$(document).ready(function(){
var canvas = document.getElementById("TBG");
var context = canvas.getContext("2d");
var ui = new Gui();
var level = new Level();
//----------Login/Register Gui --------------
$('#TBG').hide();
$('#load-new').hide();
$('#reg').hide();
$('#login').hide();
//if login_but is clicked do ui.login function
$('#login_but').click(ui.login);
//if reg_but is clicked do ui.register function
$('#reg_but').click(ui.register);
$('#new_but').click(function(){
game_settings("new");
});
$('#load_but').click(function(){
game_settings("load");
});
//if login_sumbit button is clicked do ui.login_ajax function
$("#login_submit").click(ui.login_ajax);
$("#reg_submit").click(ui.register_ajax);
$("#welcome").on("click", "#logout_but", ui.logout);
//____________________________________________
//Initialisation of game
function game_settings(state){
if(state == "load"){
ui.load_game();
//do ajax call to load user last save
//level.level_init(0,1);
draw();
}
else{
//set beginning params
//Change screens
ui.new_game();
alert("new game");
}
}
function draw () {
context.clearRect(0,0,canvas.width,canvas.height);
level.draw(context);
setTimeout(draw, 30);
}
// End Loop
});
以及这行代码(level.js)的文件如下:
function Level(){
var tilesize = 32;
var map = 0;
var mapTiles = [];
// var saved_level = level;
//var saved_location = location;
map = [
[1,1,1,1,1,1,1,1,1,1],
[2,2,2,2,2,2,2,2,2,2]
];
for (x = 1; x <= 256; x++) {
var imageObj = new Image(); // new instance for each image
imageObj.src = "images/prototype/"+x+".jpg";
mapTiles.push(imageObj);
}
this.draw = function(ctx) {
for (var x = 0; x <= 31; x++){
for ( var y = 0; y <= 31; y++){
ctx.drawImage(mapTiles[map[x][y]],x*tilesize, y*tilesize);
}
}
};
}
你们有没有遇到过这个错误?
我将如何纠正这个问题,谢谢汤姆
答案 0 :(得分:1)
忘记canvas和其他所有内容,查看map
数组和使用它的代码。让我们通过一些console.log()
调用来删除画布代码并检查数组访问:
map = [
[1,1,1,1,1,1,1,1,1,1],
[2,2,2,2,2,2,2,2,2,2]
];
console.log( map.length );
console.log( map[0].length );
for (var x = 0; x <= 31; x++){
for ( var y = 0; y <= 31; y++){
console.log( x, y, map[x], map[x] && map[x][y] );
}
}
你看到了问题吗?您可以通过考虑那些console.log()
调用将打印的内容来发现它。如果没有,请将该代码粘贴到Chrome开发者控制台中,看看它的功能。 (顺便说一句,最后一个参数有map[x] && map[x][y]
,这与map[x][y]
基本相同,但它会保护代码在map[x]
为undefined
时不会崩溃,因为您会看到日志。)
既然我们现在map[x][y]
某些时候undefined
,请回到drawImage()
调用,该调用使用此作为图像参数:
mapTiles[ map[x][y] ]
当map[x][y]
为undefined
时,该表达式会评估什么?