2013-08-24 82 views
5

Tôi đã một màn hình được vẽ lại mỗi 25ms, và hình ảnh được nhấp nháy, đây là mã của tôivẽ lại canvas html5 mà không nhấp nháy

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

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

và đây là renderMap() chức năng

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)}  
       } 

gì thay đổi tôi có cần thực hiện mã để ngừng nhấp nháy không?

Trả lời

3

Tôi tin rằng đó là vì bạn đang tải hình ảnh mỗi lần lặp lại. Hãy thử đặt var imgCharacter..., dòng sau, và onload chức năng của hình ảnh bên ngoài của renderMap vì vậy nó chỉ được chạy một lần

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) 
} 

Cảm ơn bạn marke đã cho tôi biết các onload chức năng cũng cần phải đi ra ngoài renderMap, tôi bỏ qua đây là lần đầu tiên

+0

những điều sau đây xảy ra: màn hình vẫn nhấp nháy và ký tự biến mất khi clearRect được gọi là ..:/ –

+0

Bạn có thể cập nhật nhận xét đó không? Tôi không thể nhìn thấy những gì xảy ra –

+0

màn hình vẫn nhấp nháy và nhân vật biến mất khi clearRect được gọi là ..:/ –

1

Tải tất cả hình ảnh và dữ liệu khác trước khi vẽ và lưu trữ chúng bên trong mảng.
Sử dụng tốt hơn requestAnimationFrame.
Hãy nhớ rằng việc nhận JSON (hoặc dữ liệu khác) có thể mất chút thời gian.

+0

Tôi đã sử dụng requestAnimationFrame và hoạt động tốt! ty –