JavaScript图像加载器无法正常工作

时间:2016-04-22 11:45:26

标签: javascript jquery html5

我正在尝试为我的游戏制作非常简单的图像加载器,但我无法找出为什么这不起作用..这是我的代码:

window.onload = function() {
    var canvas = document.getElementById('gameCanvas');
    var ctx = canvas.getContext('2d');

    var images = [];

    function loadImages(imageFiles) {
        var loadedImages = [];

        for(var i = 0; i < imageFiles.length; i++) {
            var image = new Image();

            image.onload = function() {
                alert("Loaded");
            }

            image.src = imageFiles[i];
            loadedImages[i] = image;
        }

        return loadedImages;
    }

    function init() {
        images = loadImages(['img/1.png', 'img/2.png']);

        main();
    }

    function main() {  
        ctx.drawImage(images[1], 0,0);  
    }

    init();
}

我看到的只是没有图像的空白画布。

5 个答案:

答案 0 :(得分:1)

  

使用Promise,Promise对象用于延迟和异步计算。承诺代表尚未完成的操作,但预计在未来。

Promise.all() Promise.all(iterable)方法返回一个承诺,该承诺在迭代参数中的所有承诺都已解决时解析。

function loadImages(imageFiles) {
  var promiseArr = [];
  for (var i = 0; i < imageFiles.length; i++) {
    var eachPromise = new Promise(function(resolve, reject) {
      var image = new Image();
      image.onload = function() {
        alert('Loaded!');
        resolve();
      }
      image.src = imageFiles[i];
    });
    promiseArr.push(eachPromise);
  }
  return promiseArr;
}

function init() {
  var AllImages = ['https://www.google.co.in/logos/doodles/2016/earth-day-2016-5741289212477440.2-5643440998055936-ror.jpg', 'https://www.google.co.in/logos/doodles/2016/earth-day-2016-5741289212477440.3-5700735861784576-ror.jpg'];
  var allPromises = loadImages(AllImages);
  Promise.all(allPromises).then(function() {
    alert('All Loaded');
    main();
  });
}

function main() {}
init();

答案 1 :(得分:0)

尝试替换

image.onload = function() {
                alert("Loaded");
            }

if(i==1){
    image.onload = function() {
                    main();
                }}

加载第二张图像时,会调用您的函数 然后编辑代码以满足您的需求 我会在一段时间内编辑更多

答案 2 :(得分:0)

图像是异步加载的,因此当您尝试在main中读取文件时,图像仍在加载。因此,您需要等到所有图像都加载完毕。

window.addEventistener("load", function() {
    var canvas = document.getElementById('gameCanvas');
    var ctx = canvas.getContext('2d');

    var images = [];

    function loadImages(imageFiles, completeFnc) {
        var loadedImages = [],
            loadedCnt = 0;

        for(var i = 0; i < imageFiles.length; i++) {
            var image = new Image();

            image.onload = function() {
                loadedCnt++;  //increment the count
                if(loadedCnt==imageFiles.length) {  //if count equals total, fire off callback
                    completeFnc();
                }
            };

            image.onerror = function () {
                alert("There was a problem loading the images");
            };

            image.src = imageFiles[i];
            loadedImages[i] = image;
        }

        return loadedImages;
    }

    function init() {
        images = loadImages(['img/1.png', 'img/2.png'], main);    
    }

    function main() {  
        ctx.drawImage(images[1], 0,0);  
    }

    init();
});

答案 3 :(得分:0)

这应该效果更好

<Route path="/tag/:slug" component={Archives} onChange={this.method.bind(this)} />

答案 4 :(得分:-1)

您需要将项目推送到数组中。替换

loadedImages[i] = image;

loadedImages.push(image);