【问题标题】:Canvas not rendering images at all画布根本不渲染图像
【发布时间】:2014-03-09 08:03:31
【问题描述】:

我从服务器发送了一系列敌人,我正在重新创建它们,因为它们已被序列化。之后,我试图让它们在画布上渲染,但由于某种原因这不起作用。

for (var i = 0; i < enemies.length; i++) { // recreate each enemy and render it
    var image = new Image();
    var currentFish = new Fish();
    for (var key in enemies[i]) { // copying properties to object that has the necessary methods
        if (enemies[i].hasOwnProperty(key)) {
            currentFish[key] = enemies[i][key];
        }
    }
    image.src = currentFish.icon;
    image.onload = function () {
        ctx.drawImage(image, currentFish.position.x, currentFish.position.y);
    };
    ctx.fillText('Drone', 250, 200);    
}

我认为问题在于 image.onload 直到帧之后或帧之间才会被调用,因此它不会被看到。我不确定如何解决这个问题。

编辑:

我忘了说我是使用 requestAnimationFrame 来处理画布的渲染,所以我不知道什么时候会渲染帧。

【问题讨论】:

    标签: javascript jquery html image canvas


    【解决方案1】:

    问题是您的外部for 循环正在用每个循环覆盖图像变量(在图像可以加载和绘制之前)。

    试试这个替代图像加载器,它将所有图像预加载到 imgs[] 中,然后调用 start():

    // image loader
    
    var imageURLs = [];  // put the paths to your images here
    var imagesOK = 0;
    var imgs = [];
    imageURLs.push("");
    loadAllImages(start);
    
    function loadAllImages(callback) {
        for (var i = 0; i < imageURLs.length; i++) {
            var img = new Image();
            imgs.push(img);
            img.onload = function() { 
                imagesOK++; 
                if (imagesOK >= imageURLs.length) {
                    callback();
                }
            };
            img.onerror = function() {alert("image load failed");} 
            img.crossOrigin = "anonymous";
            img.src = imageURLs[i];
        }      
    }
    
    function start() {
    
        // imgs[] holds fully loaded images
        // imgs[] is in the same order as imageURLs[]
    
    }
    

    【讨论】:

    • 为什么要在开头压入一个空字符串?只是为了匹配 imagesOK 和 imageURLs.length?
    • 您应该将自己的网址放在空字符串占位符所在的位置:imageURLs.push("yourImage.png"); :-)
    • 哦,好吧,我不知道这些(服务器生成)的顺序,所以我将为此设置一些东西并对其进行测试。 callback(); 不应该也只是ctx.drawImage(); 吗?
    • 这实际上不起作用,因为我还必须知道要为其绘制图像的对象的位置,并且由于我使用的是回调,所以我无法存储该信息以简单的方式为每条鱼。我的意思是不应该只是声明 ctx.drawImage(); 而不是调用 callback(); 会这样做吗?
    • 当然,循环浏览您的图像并绘制图像通常会在回调(启动)中进行 - 以及您的应用程序的任何其他初始化逻辑。干杯!
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2017-04-26
    • 2018-05-05
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多