2012-06-12 16 views
5

Sto costruendo un gioco di tela. In questo voglio far scorrere l'immagine di sfondo in un loop. Non so come farlo usando javascript. Userò una singola immagine che scorrerà continuamente sullo sfondo. Grazie in anticipo.scrolling/sliding background in html5 canvas

+0

io non sono sicuro che si potrebbe far scorrere continuamente una sola immagine - si può far scorrere due metà che uniscono perfettamente ai bordi. – Widor

+0

@Coulton non c'è motivo di usare jQuery non fa nulla con la tela. – Loktar

+0

@Widor È possibile utilizzare definitivamente un'immagine, è sufficiente copiarne alcune parti sulla tela per creare l'effetto continuo. – Loktar

risposta

11

Ci sono alcuni modi per raggiungere questo obiettivo, il primo subirà un calo di prestazioni utilizzando putImageData, il secondo metodo utilizza solo drawImage. Nota anche che il 2 ° metodo ha il codice per farlo andare da sinistra a destra, o da destra a sinistra.

http://www.somethinghitme.com/projects/bgscroll/

var ctx = document.getElementById("canvas").getContext("2d"), 
    canvasTemp = document.createElement("canvas"), 
    scrollImg = new Image(), 
    tempContext = canvasTemp.getContext("2d"), 
    imgWidth = 0, 
    imgHeight =0, 
    imageData = {}, 
    canvasWidth = 600, 
    canvasHeight = 240, 
    scrollVal = 0, 
    speed =2; 

    scrollImg.src = "citybg.png"; 
    scrollImg.onload = loadImage; 

    function loadImage(){ 
     imgWidth = scrollImg.width, 
     imgHeight = scrollImg.height; 
     canvasTemp.width = imgWidth; 
     canvasTemp.height = imgHeight;  
     tempContext.drawImage(scrollImg, 0,0, imgWidth, imgHeight); 
     imageData = tempContext.getImageData(0,0,imgWidth,imgHeight); 
     render();     
    } 

    function render(){ 
     ctx.clearRect(0,0,canvasWidth,canvasHeight); 

     if(scrollVal >= canvasWidth-speed){ 
      scrollVal = 0; 
     } 

     scrollVal+=speed; 

     // This is the bread and butter, you have to make sure the imagedata isnt larger than the canvas your putting image data to. 
     imageData = tempContext.getImageData(canvasWidth-scrollVal,0,scrollVal,canvasHeight); 
     ctx.putImageData(imageData, 0,0,0,0,scrollVal, imgHeight); 
     imageData = tempContext.getImageData(0,0,canvasWidth-scrollVal,canvasHeight); 
     ctx.putImageData(imageData, scrollVal,0,0,0,canvasWidth-scrollVal, imgHeight); 

     setTimeout(function(){render();},10); 
    } 

2a Metodo utilizza lo stesso codice come sopra, basta cambiare queste due funzioni di seguito.

http://www.somethinghitme.com/projects/bgscroll/scrolldrawimage.html

function loadImage(){ 
    imgWidth = scrollImg.width, 
    imgHeight = scrollImg.height; 
    canvasTemp.width = imgWidth; 
    canvasTemp.height = imgHeight;  
    render();     
} 

function render(){ 
    ctx.clearRect(0,0,canvasWidth,canvasHeight); 

    if(scrollVal >= canvasWidth){ 
     scrollVal = 0; 
    } 

    scrollVal+=speed;     
    ctx.drawImage(scrollImg,canvasWidth-scrollVal,0,scrollVal,imgHeight, 0, 0, scrollVal,imgHeight); 
    ctx.drawImage(scrollImg,scrollVal,0,imgWidth, imgHeight); 

    // To go the other way instead 
    ctx.drawImage(scrollImg,-scrollVal,0,imgWidth, imgHeight); 
    ctx.drawImage(scrollImg,canvasWidth-scrollVal,0,imgWidth, imgHeight); 

    setTimeout(function(){render();},10); 
} 
+0

Ciao Loktar, grazie per la risposta. Potresti dirmi come invertire la direzione (da destra a sinistra). L'ho provato ma senza successo. – rgolekar

+1

@ user1451031 Ho modificato la mia risposta e l'ho aggiunta al secondo metodo sotto il commento '// Per andare dall'altra parte 'dal momento che il secondo metodo è quello che funziona meglio. – Loktar

+1

@ Loktar, grazie mille. Mi hai salvato la giornata :) – rgolekar