【发布时间】:2016-02-13 14:42:27
【问题描述】:
我有一些加载图片的代码。
var assets = {
total:0,
success:0,
error:0
};
var stillLoading = true;
var img = {};
function LoadImage(name, path){
var toLoad = new Image();
toLoad.src = path;
assets.total++;
toLoad.addEventListener("load", function(){
assets.success++;
console.log(name + " loaded.");
img[name] = toLoad;
}, false);
toLoad.addEventListener("error", function(){
assets.error++;
}, false);
};
function Loading(){
if (assets.success == assets.total){
if (stillLoading){
console.log("All assets loaded. Starting game.");
};
stillLoading = false;
return false;
}else{
stillLoading = true;
return true;
};
};
可能仍然是低效和丑陋的,因为我是新手练习 javascript,欢迎提出建议。它加载图像并通过函数 Loading() 告诉主程序所有资源何时完成加载,然后将图像添加到对象 img。
我已经为我的图像使用了一段时间了,它确实有效。
例如,如果我这样做了。
LoadImage("Car", "imageOfCar.png");
ctx.drawImage(img.Car, 0, 0);
这会将图像很好地绘制到画布上。
但是,当我为另一个变量分配图像时,出于各种原因,我想要这样做,例如将图像分配给对象。例如
var secondCar = img.Car
然后尝试绘制它。
ctx.drawImage(secondCar, 0, 0);
我收到此错误。
未捕获的类型错误:无法在“CanvasRenderingContext2D”上执行“drawImage”:提供的值不是类型“(HTMLImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap)”
如果它适用于初始变量,它应该以相同的方式处理刚刚分配了完全相同的东西的另一个变量。那么为什么会出现这个错误呢?
如果我以不检查是否已完成加载的典型方式加载图像。
img.Car = new Image();
img.Car.src = "imageOfCar.png";
secondCar = img.Car;
ctx.drawImage(secondCar);
这会奏效。 这里的行为有点令人困惑,有人可以向我解释发生了什么,并可能提出解决方法吗?
编辑:只是为了澄清。
这是 html 文件,名为 index.html。
<!DOCTYPE html>
<head>
<title>HTML5 Game Base</title>
<link rel = "stylesheet" type = "text/css" href = "styles.css">
</head>
<body>
<canvas id="screen" width="270" height="480" style="border:1px solid #000000;"></canvas>
<script src = "script.js"></script>
</body>
</html>
画布设置为screen。我上面显示的所有 javascript 代码都发生在 index.html 中调用的 script.js 中。
这就是在 script.js 中调用 screen 的方式。
var canvas = document.getElementById("screen");
var ctx = canvas.getContext("2d");
这就是ctx.drawImage() 所引用的内容。
【问题讨论】:
-
ctx变量在哪里定义? -
啊,那是我忘记澄清的事情了。我已经在一个 html 文件中设置了画布。 html 文件然后调用一个 javascript 文件,该文件将画布称为
ctx。我在这里显示的所有代码都发生在 javascript 文件中,我已经提出了一些含义,所以如果还有什么,请询问。 -
html文件然后调用一个javascript文件,该文件将canvas调用为ctx。所以显示相关代码。
-
完成了,请再看看。谢谢。
-
"但是,当我为另一个变量分配图像时,出于各种原因我想做的事情,例如将图像分配给对象。例如
var secondCar = img.Car" 是@987654335在LoadImage之后定义的@ 被调用?你能创建一个 stacksn-ps 或 jsfiddle jsfiddle.net 来演示错误信息吗?
标签: javascript html image load