我正在用 JavaScript 开发二十一点游戏,我有以下功能:
function loadImages(){
var imagesNum = 0;
var imagesLoaded = 0;
//make sure the cardRects array is 0 before repopulating
while(cardRects.length > 0){
cardRects.pop();
cardImages.pop();
}
for(var i = 0; i <= playerNum; i++){
cardRects[i] = [];
cardImages[i] = [];
for(var j = 0; j < playerHands[i].length; j++){
imagesNum++;
}
}
for(var i = 0; i <= playerNum; i++){
for(var j = 0; j < playerHands[i].length; j++){
cardImages[i][j] = new Image();
cardImages[i][j].onload = function(){
imagesLoaded++;
console.log("imagesLoaded = " + imagesLoaded + " and imagesNum = " + imagesNum);
if(imagesLoaded == imagesNum){
console.log("Images loaded!");
draw();
}
}
if(i == playerNum && j == 1 && !showdown){
console.log("Not showdown yet, so only see back of dealer's 2nd card.");
cardImages[i][j].src = "images/cards/backsandpips/Red_Back.png";
}
else{
console.log("Assigning card image...");
cardImages[i][j].src = playerHands[i][j].imageFile;
}
}
}
}
如您所见,加载所有卡片图像后,draw()
调用该函数。该draw()
函数的末尾包含一个部分,如果该回合结束,则计算奖金并显示带有结果的消息。这大约有一半的时间失败了。在我最近的测试中,控制台中显示了以下内容:
接下来是:
imagesLoaded = 1 and imagesNum = 24
...
imagesLoaded = 23 and imagesNum = 24
然后
imagesLoaded = 1 and imagesNum = 24
...
imagesLoaded = 24 and imagesNum = 24
loadImages()
一次只调用一次,所以我的两个问题是:
(1) 为什么控制台先显示“[24]Assigning card image...”两次?预期的事件过程是它显示此消息一次并直接进入实际加载图像。(2) 为什么在图像加载过程重新启动并最终完成之前,仅加载了 24 张图像中的 23 张?
我应该说这个错误只发生在loadImages()
一轮结束时被调用,而不是在任何其他点。
在 JavaScript 中加载图像是否有一些我不知道的复杂性?