2012-06-12 11 views
5

私はキャンバスゲームを構築しています。これで私はループで背景画像をスライドさせたい。私はjavascriptを使ってこれを行う方法を知らない。私はバックグラウンドに連続してスライドする単一のイメージを使用します。 ありがとうございます。html5キャンバスでのスクロール/スライドバック

+0

私はあなたが継続的に一つの画像をスライド可能性がわからない - あなたは、エッジでシームレスに結合する二つの部分をスライドさせことができます。 – Widor

+0

@Coulton jQueryを使う理由はありません。キャンバスで何もしません。 – Loktar

+0

@Widor最も確実に1つの画像を使用できます。その一部をキャンバスにコピーするだけで、シームレスな効果が得られます。 – Loktar

答えて

11

これを達成するためのいくつかの方法は、最初のものがputImageDataを使用してパフォーマンスヒットを行い、2番目の方法がdrawImageを使用するだけです。また、2番目のメソッドには、左から右へ、または右から左へのいずれかのコードがあります。

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方法上記と同じコードを使用して、ちょうど次に、これらの二つの機能を変更します。

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

こんにちはロクータ、答えに感謝します。方向を逆にする方法を教えてください(右から左へ)。私はそれを試みたが成功しなかった。 – rgolekar

+1

@ user1451031私は自分の答えを編集し、2番目のメソッドがより良い実行結果であるため、コメントの下に2番目のメソッドに追加しました。 – Loktar

+1

@ Loktarありがとうございました。あなたは私の日を救った:) – rgolekar