我正在制作一个非常简单的游戏引擎,并且正在开发一个函数来制作精灵并将其绘制到画布上,但是似乎无法绘制。图像会加载,并显示在chrome源中,但不想绘制。
错误如下:
Neutrino.js:44未捕获的TypeError:无法在'CanvasRenderingContext2D'上执行'drawImage':提供的值不是'(CSSImageValue或HTMLImageElement或SVGImageElement或HTMLVideoElement或HTMLCanvasElement或ImageBitmap或OffscreenCanvas)类型的值 在Image.Sprite.img.onload
这是我的代码:
var canvas = document.createElement("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
document.body.appendChild(canvas);
var c = canvas.getContext("2d");
var Sprite = function(src,x,y,w,h,ctx) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.src = src;
this.img = new Image(this.w,this.h);
this.img.onload = function() {
ctx.drawImage(this.img,this.x,this.y);
};
this.img.src = this.src;
return this;
}
var puppy = new Sprite("puppy.jpg",100,100,100,100,c);
“ puppy.jpg”也在当前的Web目录中。
答案 0 :(得分:0)
您的onload回调使用this
关键字,它与外部作用域(How does the "this" keyword work?)中的this
不同。您应该通过制作外部this
的副本并在回调中使用该副本来解决此问题:
var _this = this;
this.img.onload = function() {
ctx.drawImage(_this.img, _this.x, _this.y);
};
或者您可以将lambda替换为回调函数,该lambda对this
关键字的处理方式有所不同。我应该记住,目前只有现代浏览器支持lambda(https://caniuse.com/#feat=arrow-functions),因此上述第一个解决方案可能是一个更好的解决方案,具体取决于您要吸引的受众。这是lambda版本:
this.img.onload = () => ctx.drawImage(this.img, this.x, this.y);