2013-08-24 23 views
5

Ho uno schermo essendo ridisegnare ogni 25 ms, e le immagini sono tremolante, qui è il mio codiceridisegnando canvas HTML5 senza sfarfallio

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

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

e qui è la funzione

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

cosa cambia() renderMap devo fare il codice per fermare lo sfarfallio?

risposta

3

Credo che sia perché si sta caricando l'immagine ogni iterazione. Prova a mettere il var imgCharacter..., la seguente riga, e la funzione dell'immagine onload al di fuori di renderMap così si ha solo una volta

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

Grazie a Marke per avermi fatto sapere la funzione onload ha anche bisogno di andare fuori renderMap, ho trascurato la prima volta

+0

succede quanto segue: lo schermo continua a lampeggiare e il carattere scompare quando viene chiamato clearRect ..:/ –

+0

È possibile aggiornare quel commento? Non riesco a vedere cosa succede allo schermo –

+0

e il carattere scompare quando viene chiamato clearRect ..:/ –

1

Caricare tutte le immagini e altri dati prima di disegnarli e memorizzarli all'interno di un array.
Migliore utilizzo requestAnimationFrame.
Ricordare che ottenere JSON (o altri dati) può richiedere del tempo.

+0

Ho usato requestAnimationFrame e ha funzionato bene! ty –