我正在使用帆布进行游戏。我有一个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文档中创建的,而我的所有元素都是动态创建的,不知道是否有任何区别。
干杯
答案 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);
}
(我个人会合并setImagePath
和setImage
- 保持简单。)