new Image()
ではなく試してみてくださいnew image()
移動も
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var cloud = new image();
cloud.src='small_cloud.png';
draw()
これらを一度だけ設定したいので、関数の外に。ブラウザがドキュメントを解析する時間ができるまで、この設定を遅らせます。
window.onload = function(){ ... };
(ただし、実際には、適切な偶数ハンドラー登録を使用して、既存の window.onload リスナーを上書きしないようにする必要があります。) また、次のdraw()
ように、イメージが読み込まれるまで最初の呼び出しを遅らせます。
cloud.onload = function(){
draw(cloud, 0, 0);
}
私も変わるだろう
var loopTimer = setTimeout('draw('+x+','+y+')',20);
に
setTimeout(function(){ draw(x, y); }, 20);
loopTimer 変数を使用していないようであり、 setTimeout を文字列ではなく匿名関数に渡すことをお勧めします。
最終的には、次のようになります。
window.onload = function() {
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var cloud = new image();
cloud.src='small_cloud.png';
cloud.onload = function(){
draw(ctx, cloud, 0, 0);
};
};
function draw(ctx, cloud, x,y){
x += 2;
if(x>1000){
x=0;
}
ctx.drawImage(cloud,x,0);
setTimeout(function(){ draw(ctx, cloud, x, y); }, 20);
}
ctx は draw() 関数内で定義されなくなったため、無名の window.onload 関数に対してローカルであるため、ctx を draw() 関数にも渡す必要があることに注意してください。