画布:drawImage不会将图像绘制到画布上

时间:2013-10-23 15:30:50

标签: javascript html5 canvas drawimage

我正在使用帆布进行游戏。我有一个Sprite对象,它将自己绘制到画布上,在Sprite类中,我在创建对象时创建了Image成员及其src属性。

以下是无效的代码:

Sprite.prototype.draw = function(Context){
    this.Image.onLoad = function(){
    Context.drawImage(this.getImage(),this.getX(),this.getY());
    };
};

在对象构造函数中,我传入一个字符串param,它是Image的文件路径 - 这是正确存储的。

我感觉问题出在setImage函数中:

Sprite.prototype.setImage = function(){
    this.Image = document.createElement('img');
    this.Image.src = this.getImagePath(); //This just returns the path as a                                                                      
                                            string
};

我在运行时没有错误......但是图像没有被绘制到屏幕上?

任何人都可以指出是什么?我已经搜索了这个问题的答案,但是在每个人的所有元素都是在html文档中创建的,而我的所有元素都是动态创建的,不知道是否有任何区别。

干杯

1 个答案:

答案 0 :(得分:4)

您的代码构建在同步模型上,但您正在使用异步调用,这意味着这将无法正常工作。

首先在图像对象上设置一个url,这意味着立即调用加载过程。当你调用draw时,图像可能已经加载或者可能没有加载(如果它存在于缓存中,这个过程通常是即时的)所以当你设置你的onload处理程序(必须是小写)时,图像对象可能会通过那个阶段永远不会被调用(浏览器不会等待它被设置)。

为此,您需要使用不同的模型,例如回调和/或承诺。为简单起见,回调就可以了。

这方面的一个例子可能是:

Sprite.prototype.setImage = function(callback){
    this.Image = document.createElement('img');
    this.Image.onload = function() {
        callback(this); /// just for ex: passing image to callback (or other inf)
    }
    this.Image.src = this.getImagePath();
};
Sprite.prototype.draw = function(Context){
    Context.drawImage(this.getImage(), this.getX(), this.getY());
};

这样当图像加载时,它会调用您指定为回调的函数,例如:

var sprite = new Sprite(); /// pseudo as I don't know you real code

sprite.setImagePath('someurl');
sprite.setImage(imageLoaded);

function imageLoaded() {
    sprite.draw(context);
}

(我个人会合并setImagePathsetImage - 保持简单。)