【问题标题】:HTML5 Canvas drawing an image set in for loop only draws the last iteration image setHTML5 Canvas 在 for 循环中绘制图像集仅绘制最后一次迭代的图像集
【发布时间】:2019-03-28 03:50:05
【问题描述】:

我正在尝试使用 for 循环内的图像加载器绘制图像。它仅在最后一次迭代中绘制所有图像。

在控制台中它不显示draw -> 0draw -> 1 它只显示draw -> 2

感谢您的帮助!!

这是我的代码块:

        // For every player run iteration
        var pos="";
        var iter="";
        for (var i = 0; i < item.length; ++i) {
            // Position for players on account screen

            if(i == 0){ pos = "61px"; iter = 0; console.log("pos 0 -> " + iter);}
            if(i == 1){ pos = "168px"; iter = 1; console.log("pos 1 -> " + iter);}
            if(i == 2){ pos = "275px"; iter = 2; console.log("pos 2 -> " + iter);}
            console.log(i);
            console.log("pos -> " + pos);
            console.log("iter -> " + iter);
            // Gets player name from string
            let player = item[i].match( /([A-Z])\w+/g );

            // Create player div for mouse interaction
            let player_el = $('<div class="cursor player" id="player'+ player +'"></div>');
            $("#can_wrapper").append(player_el);
            $("#player"+ player).css({"position": "absolute", "height": "50px", "width": "50px", "left": ""+ pos +"", "top": "271px", "cursor": "grab", "cursor": "-webkit-grab"});

            // Get player name for hover action
            let player_name_el = player;
            document.styleSheets[0].addRule('#player'+ player +':hover::after','content: "'+player_name_el+'";');

            /**
             * Promisify loading an image
             * @param {String} imagePath The web location of the image
             * @returns {Promise} A Promise that will resolve to an Image
             */
            function loadImage(imagePath) {
                return new Promise((resolve, reject) => {
                    let image = new Image();
                    image.addEventListener("load", () => {
                        resolve(image);
                    });
                    image.addEventListener("error", (err) => {
                        reject(err);
                    });
                    image.src = '../interface/images/body/' + imagePath;
                });
            }

            let imageSources = ['v1456.png', 'vbody0.png','vhead14.png','v1960.png','v578.png','v1221.png', 'v3063.png']; // url and order

            Promise
                .all(imageSources.map(ii => loadImage(ii)))
                .then((images) => {
                    images.forEach((image) => {
                        if (iter == 0) { ctx.drawImage(image, 60, 270); console.log("draw -> 0");}
                        if (iter == 1) { ctx.drawImage(image, 167, 270); console.log("draw -> 1");}
                        if (iter == 2) { ctx.drawImage(image, 274, 270); console.log("draw -> 2");}
                        console.log(iter);
                    });
                }).catch((err) => {
                    console.error(err);
                });
        }

【问题讨论】:

  • imageSources.map(ii =&gt; loadImage(ii)) 承诺解决时,即在调用.then 回调之前,for (var i = 0; i &lt; item.length; ++i) 循环将完成,iter 将是 2 ... 大提示你做错了是pos 2 -&gt; 2在任何draw被注销之前被记录——你需要重新考虑你的代码——我什至无法想象你想要以什么顺序实现目标跨度>
  • 我正在尝试为每次迭代绘制数组中的角色图稿。 i.imgur.com/yAOghrQ.png 红色方块是 3 次迭代,最后一次迭代是正在绘制的内容。图像必须在图像加载器中,因为它们需要以特定方式加载,以便正确堆叠
  • 现在只使用相同的图像作为占位符。在我让它们正确显示后,我将从数据库中动态提取它。老实说,我真的不知道承诺是如何运作的
  • 谢谢我看看我能从你的例子中找出什么
  • 你需要记住的是...... Promise .then 被异步调用 - 所以你需要考虑到这一点

标签: javascript jquery html canvas


【解决方案1】:

我建议将 function loadImage 移到循环之外

如果您使用let 而不是var 并将pos 和iter 的声明移动到for 循环中,那么它应该可以工作

function loadImage(imagePath) {
    return new Promise((resolve, reject) => {
        let image = new Image();
        image.addEventListener("load", () => {
            resolve(image);
        });
        image.addEventListener("error", (err) => {
            reject(err);
        });
        image.src = '../interface/images/body/' + imagePath;
    });
}

for (let i = 0; i < item.length; ++i) {
    let pos="";
    let iter="";
    // rest of your code remains unchanged
}

【讨论】:

  • 现在可以按预期工作了!再次感谢您的帮助!
  • "let" 有很大的不同,我仍然想知道为什么。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2013-11-26
相关资源
最近更新 更多