javascript - 重绘 Canvas html5而不闪烁

标签 javascript html canvas redraw

我的屏幕每 25 毫秒重绘一次,图像闪烁,这是我的代码

                var FRAME_RATE = 40;
                var intervalTime = 1000/FRAME_RATE;
                gameLoop();

                function gameLoop(){
                    context.clearRect(0, 0, 640, 640);
                    renderMap();
                    window.setTimeout(gameLoop, intervalTime);  
                }

这里是 renderMap() 函数

function renderMap(){
                    var startX = playerX - (screenW / 2);
                    var startY = playerY - (screenH / 2);

                    maxX = playerX + (screenW / 2);
                    maxY = playerY + (screenH / 2);
                    $.getJSON('mapa3.json', function(json){
                        for (x = startX; x < maxX; x=x+32){ 
                            for (y = startY; y < maxY; y=y+32){
                                intTile = json.layers[0].data[((y/32)* 100) + (x/32)];
                                context.putImageData(getTile(intTile - 1), x - startX, y - startY);
                            }
                        } 
                    });

                    var imgCharacter = new Image();
                    imgCharacter.src = 'char.png';

                    var posX = (screenW - imgCharacter.width) / 2;
                    var posY = (screenH - imgCharacter.height) / 2;
                    imgCharacter.onload = function(){context.drawImage(imgCharacter, posX, posY)}       
                }

我需要对代码进行哪些更改才能停止闪烁?

最佳答案

我相信这是因为您每次迭代都在加载图像。尝试将 var imgCharacter...、下一行和图像的 onload 函数放在 renderMap 之外,这样它只运行一次

var imgCharacter = new Image();    
imgCharacter.onload = function () {
    renderMap();
}
imgCharacter.src = 'char.png';

function renderMap() {
    var startX = playerX - (screenW / 2);
    var startY = playerY - (screenH / 2);

    maxX = playerX + (screenW / 2);
    maxY = playerY + (screenH / 2);
    $.getJSON('mapa3.json', function (json) {
        for (x = startX; x < maxX; x = x + 32) {
            for (y = startY; y < maxY; y = y + 32) {
                intTile = json.layers[0].data[((y / 32) * 100) + (x / 32)];
                context.putImageData(getTile(intTile - 1), x - startX, y - startY);
            }
        }
    });

    var posX = (screenW - imgCharacter.width) / 2;
    var posY = (screenH - imgCharacter.height) / 2;

    context.drawImage(imgCharacter, posX, posY)
}

感谢markE让我知道onload函数也需要在renderMap之外,我第一次忽略了

关于javascript - 重绘 Canvas html5而不闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423950/

相关文章:

javascript - 随机失败的测试 jest 和 supertest Node.js

Javascript:意外的标记}

javascript - 如何调试 VueJS getElementById 问题

php - PHP 文件不能以 .html 扩展名存储吗?我听说某些浏览器不支持 .php 我不确定这可能是什么补救措施?

javascript - HTML 5 Canvas - 旋转、缩放、平移和绘制图像

javascript - 如何将对象数组从输入框传递到 JavaScript 中的单独数组中

html - Jasper Reports - 显示来自 html 源的图像

javascript - 如何在 JQuery 中到达容器 scrollTop 时淡入元素?

javascript - Canvas 上的图像阻止 Canvas 对象移动

javascript - 在 Canvas 上交换图像会占用内存