一个预加载图像的功能 - 现在需要绘制它们,但是如何?

时间:2013-07-05 02:02:20

标签: javascript html5 canvas

我正在玩弄画布。我有点迷失方向。

我有这个功能:

function preloadimages(arr) {
        var newimages = []
        var arr = (typeof arr != "object") ? [arr] : arr
        for (var i = 0; i < arr.length; i++) {
            newimages[i] = new Image()
            newimages[i].src = arr[i]
        }
    }

我称之为:

preloadimages(['images/background.png', 'images/hero.png', 'images/monster.png']);

唯一的问题是,我不知道如何在以后再次绘制它们。

如果我在我的js中预加载一个图像,我会说:

var bgOk = false;
var bg = new Image();
bg.onload = function () {
    bgOk = true;
};
bg.src = "images/background.png";

然后在我想要它的时候进一步向下我会说:

if (bgOk) {
        context.drawImage(bg, 0, 0);
    }

就是这样。问题是我已经制作了一个preloader类,我真的不知道现在如何只调用我想要绘制的图像,甚至如何实现bgOk的想法,这样如果它加载好了,我可以绘制它,如果没有,请不要管它。

有人可以就此提出建议吗?我基本上只是想尝试更多基于类,而不是通常使用一个丑陋且不具备维护性的巨大javascript文件的脏混乱。

2 个答案:

答案 0 :(得分:4)

这似乎是一个复杂的问题,但实际上并没有它看起来那么糟糕。如果您想使用预先存在的代码,或者只是想查看有关创意的内容,可以查看:http://thinkpixellab.com/pxloader/此库用于剪切绳索的HTML5版本。

一个简单的自定义实现可能如下所示:

function loadImages(arr, callback) {
    this.images = {};
    var loadedImageCount = 0;

    // Make sure arr is actually an array and any other error checking
    for (var i = 0; i < arr.length; i++){
        var img = new Image();
        img.onload = imageLoaded;
        img.src = arr[i];
        this.images[arr[i] = img;
    }

    function imageLoaded(e) {
        loadedImageCount++;
        if (loadedImageCount >= arr.length) {
            callback();
        }
    }
}

然后你可以这样称呼它:

var loader = loadImages(['path/to/img1', 'path/to/img2', 'path/to/img3'], function() {
    ctx.drawImage(loader.images['path/to/img1']); // This would draw image 1 after all the images have been loaded

    // Draw all of the loaded images
    for (var i = 0; i < loader.images.length; i++) {
        ctx.drawImage(loader.images[i]);
    }
});

如果您想了解有关资产加载的更多详细信息,可以查看Udacity的HTML5游戏开发课程的资产加载部分https://www.udacity.com/course/cs255

答案 1 :(得分:3)

我使用的功能:

function ImageLoader(sources, callback) 
{
    var images = {};
    var loadedImages = 0;
    var numImages = 0;

    // get num of sources
    for (var src in sources) {
        numImages++;
    }

    for (var src in sources) {
        images[src] = new Image();
        images[src].onload = function() {

            if (++loadedImages >= numImages) {
                callback(images);
            }
        };
        images[src].src = sources[src];
    }
}

你这样称呼它:

var sources = {
    bg: path/to/img.png,
    title: path/to/img/png
};

var _images = {};
isReady = ImageLoader(sources, function(images) {
    _images = images;
});

然后访问您的图片

_images.bg;

示例: drawImage(_images.bg, 0, 0);