重绘画布html5没有闪烁

Jul*_*ima 6 javascript html5 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);  
                }
Run Code Online (Sandbox Code Playgroud)

这里是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)}       
                }
Run Code Online (Sandbox Code Playgroud)

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

Zac*_*ier 5

我相信这是因为你每次迭代都在加载图像.尝试将以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)
}
Run Code Online (Sandbox Code Playgroud)

感谢markE让我知道这个onload功能还需要走出去renderMap,我第一次忽略了它

  • @Zeaklous:你差点搞定了......将你的imgCharacter.onload移到renderMap之外,然后在onload中调用renderMap().然后在renderMap里面,只有context.drawImage(imgCharacter,posX,posY) (3认同)