Задержка функции до загрузки актива? - PullRequest
2 голосов
/ 16 сентября 2011

Я играю с холстом, и, кажется, он отлично работает в FF6, но в Chrome 13 спрайт, который я рисую, не отображается надежно.Я провел некоторое исследование и обнаружил, что проблема связана с срабатыванием функции до полной загрузки ресурса.

Fiddle здесь: http://jsfiddle.net/LqHY9/

Соответствующий Javascript:

    function sprite(ipath, sh, sw, ih, iw){
    /* BASIC INFO FOR SPRITE */
        this.frameWidth = sw;
        this.frameHeight= sh;
        frame_rows = ih/sh;
        frame_columns = iw/sw;
        num_frames = frame_columns*frame_rows ;
        this.frame = new Array();
        frameNumber = 0;
        for(row = 0; row<frame_rows; row++){
            for(i=0;i<frame_columns;i++){
                this.frame[frameNumber] = {};
                this.frame[frameNumber].offsetX = this.frameWidth*i;
                this.frame[frameNumber].offsetY = this.frameHeight*row;
                frameNumber++
            }
        }
        this.sheight = sh;
        this.swidth = sw;
        this.raw = new Image();
        this.raw.src = ipath;
    }
    animation=new sprite("http://www.melonjs.org/tutorial/tutorial_final/data/sprite/gripe_run_right.png",64,64,64,512);

context.drawImage(animation.raw, animation.frame[0].offsetX, animation.frame[0].offsetY, animation.frameWidth, animation.frameHeight, 0, 0, animation.frameWidth,animation.frameHeight)

(Не волнуйтесь, моя переменная контекста определена, я просто вырезал этот бит, вы можете увидеть все это в JSFiddle.)

Ответы [ 4 ]

1 голос
/ 16 сентября 2011

объект Image () имеет событие onload (и onerror).Если вам нужно выполнить что-то после загрузки, вы можете прикрепить функцию.

например,

var img = new Image();
img.onload = function() {
//do something
};

Просто убедитесь, что вы подключаете нагрузку перед установкой src.

1 голос
/ 16 сентября 2011

Вам необходимо использовать обработчик загрузки для изображения.Вы должны установить обработчик, прежде чем установить .src для объекта, потому что в некоторых браузерах событие загрузки может сработать сразу после установки .src, если изображение находится в кэше браузера.Вот фрагмент псевдокода:

var img = new Image();
img.onload = function () {
    // image is now loaded and ready for handling
    // you can safely start your sprite animation
}
img.src = "xxx";

Вы можете увидеть связанный пример кода из другого ответа, который я написал здесь: jQuery: Как проверить, когда все изображения в массиве загружены? .

1 голос
/ 16 сентября 2011

Объект Image имеет событие onload, к которому вы должны подключиться.

Предполагая, что у вас есть более одного изображения, вы можете реализовать своего рода «загрузчик».В основном это будет просто взять массив URL-адресов изображений, загрузить каждый из них и прослушать их события загрузки.После загрузки каждого изображения оно, в свою очередь, вызывает другую функцию, которая будет сигнализировать о завершении загрузки каждого ресурса.

0 голосов
/ 25 августа 2014
function Sprite(urls, speed, box)
{
    var that = this, running = false, interval = 0, loaded = false;

    that.urls = urls;
    that.speed = speed;
    that.images = new Array();
    that.box = box || { x: 0.0, y: 0.0, w: 64, h: 64 };

    for(var i = 0; i < that.urls.length; ++i)
    {
        that.images[i] = new Image();
        that.images[i].src = that.urls[i];
        that.images[i].id = i;
        var len = that.urls.length;
        that.images[i].onload = function(){ if(parseInt(this.id) === len) { loaded = true; } };
    }
    that.current = 0;

    var Draw = function(ctx)
    {
        if(loaded)
        {
            var curr = that.images[that.current];
            ctx.drawImage(curr, 0.0, 0.0, curr.width, curr.height, that.box.x, that.box.y, that.box.w, that.box.h);
        }  
    };

    that.Run = function(ctx)
    {
        if(!running)
        {
            running = true;
            interval = setInterval(function(){
                Draw(ctx);
                if(that.current < that.urls.length) 
                { 
                    that.current++; 
                } 
                else 
                {
                    that.current = 0;  
                }
            }, that.speed);
        }
    };

    that.Clear = function()
    {
        if(running)
        {
            running = false;
            clearInterval(interval);
        }
    };
}

// Exemple

var test = new Sprite(["image1.png", "image2.png", "image3.png"], 250);
test.Run(myContext);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...