Javascript图像对象未绘制到2D画布

时间:2018-07-27 20:56:38

标签: javascript html5 image

我正在制作一个非常简单的游戏引擎,并且正在开发一个函数来制作精灵并将其绘制到画布上,但是似乎无法绘制。图像会加载,并显示在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目录中。

1 个答案:

答案 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);