4

我正在涉足帆布。我有点迷失了一些东西。

我有这个功能:

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);
    }

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

有人可以建议我吗?我基本上只是想更多地基于类,而不是我通常使用一个丑陋且不可维护的巨大 javascript 文件的脏乱差。

4

2 回答 2

8

这似乎是一个复杂的问题,但实际上并不像看起来那么糟糕。如果你想使用预先存在的代码,或者只是想看看一些想法,你可以看看:http ://thinkpixellab.com/pxloader/这个库在 HTML5 版本的 Cut The Rope 中使用。

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

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

于 2013-07-05T02:20:39.740 回答
4

我使用的一个功能:

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);

于 2013-07-05T02:12:05.500 回答