2012-06-12 43 views
5

Tuval oyunu yapıyorum. Bu durumda arka plan resmini bir döngüde kaydırmak istiyorum. Javascript kullanarak bunu nasıl yapacağımı bilmiyorum. Sürekli arka plana kayan tek bir görüntü kullanacağım. Şimdiden teşekkürler.html5 tuvalinde kaydırma/kaydırma arka planı

+0

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

Ben sürekli bir görüntü slayt emin değilim - Sen kenarlarında sorunsuz katılmak iki yarısını slayt. – Widor

+0

@Coulton, jQuery'yi kullanmak için bir neden yok, tuval ile hiçbir şey yapmaz. – Loktar

+0

@Widor Bir görüntüyü kesinlikle kullanabilirsiniz, sadece bir kısmını tuval üzerine kopyalayıp kusursuz efekt yaratırsınız. – Loktar

cevap

11

Bunu gerçekleştirmenin birkaç yolu, putImageData kullanarak bir performans isabeti alacaktır, ikinci yöntem sadece drawImage kullanır. Ayrıca, 2. yöntemin, soldan sağa veya sağdan sola gitmesini sağlayan kodu vardır.

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

2 Yöntem sadece aşağıdakilere Bu iki işlevi değiştirmek Yukarıdaki aynı kodu kullanır.

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

Merhaba Loktar, cevabınız için teşekkürler. Bana yönünü nasıl tersine çevirebileceğinizi söyler misiniz (sağdan sola). Denedim ama başarı yok. – rgolekar

+1

@ user1451031 Cevabımı düzenledim ve ikinci yönteme daha iyi performans gösteren ikinci yöntem olduğundan dolayı diğer yönteme geçmek için ikinci yönteme ekledim. – Loktar

+1

@ Loktar çok teşekkürler. Günümü kurtardın :) – rgolekar

İlgili konular