更新:質問の新しい情報に基づいて、あなたの問題(再掲)は、次のいずれかをしたいということです
- 最初にすべての画像が読み込まれるのを待ってから、それらの画像でアニメーションを開始するか、
- アニメーション化を開始し、利用可能な場合にのみ画像を使用します。
両方について以下に説明します。
1.多くの画像を読み込んで、それらが終了したときにのみ続行する
この手法では、すべての画像をすぐに読み込み、最後の画像が読み込まれたときにカスタム コールバックを実行します。
// Load images and run the whenLoaded callback when all have loaded;
// The callback is passed an array of loaded Image objects.
function loadImages(paths,whenLoaded){
var imgs=[];
paths.forEach(function(path){
var img = new Image;
img.onload = function(){
imgs.push(img);
if (imgs.length==paths.length) whenLoaded(imgs);
}
img.src = path;
});
}
var imagePaths = [...]; // array of strings
loadImages(imagePaths,function(loadedImages){
setInterval(function(){ animateInCircle(loadedImages) }, 30);
});
2.これまでにロードされたすべての画像を追跡する
この手法では、すぐにアニメーションを開始しますが、画像が読み込まれてからのみ描画します。これまでにロードされた画像の数に基づいて、円の寸法が動的に変化します。
var imagePaths = [...]; // array of strings
var loadedImages = []; // array of Image objects loaded so far
imagePaths.forEach(function(path){
// When an image has loaded, add it to the array of loaded images
var img = new Image;
img.onload = function(){ loadedImages.push(img); }
img.src = path;
});
setInterval(function(){
// Only animate the images loaded so far
animateInCircle(loadedImages);
}, 100);
また、画像を円で移動するだけでなく、円で回転させたい場合は、次のようにします。
ctx.save();
ctx.translate(cx,cy); // Center of circle
ctx.rotate( (angleOffset+(new Date)/3000) % Math.TAU );
ctx.translate(radius-img.width/2,-img.height/2);
ctx.drawImage(img,0,0);
ctx.restore();
元の答えは次のとおりです。
一般に、各イメージの読み込みが完了するまで待つ必要があります。
function animate(){
var img1 = new Image;
img1.onload = function(){
context.drawImage(img1,x1,y1);
};
img1.src = "/path";
var img2 = new Image;
img2.onload = function(){
context.drawImage(img2,x2,y2);
};
img2.src = "/path";
}
オブジェクトを使用して、このコードをより DRY にすることができます。
var imgLocs = {
"/path1" : { x:17, y:42 },
"/path2" : { x:99, y:131 },
// as many as you want
};
function animate(){
for (var path in imgLocs){
(function(imgPath){
var xy = imgLocs[imgPath];
var img = new Image;
img.onload = function(){
context.drawImage( img, xy.x, xy.y );
}
img.src = imgPath;
})(path);
}
}