2016-05-08 11 views
-1

私のオブジェクトを左から右に動かすと、私の四角形(ここで私は高得点と寿命を置くはずです)がちらつきますか?これをどうすれば解決できますか?私はfillTextを使用するときに同じ問題を抱えています。私はパドルで左または右に移動するたびにテキストがちらつきます。画像を移動するとオブジェクト(矩形)がちらつくのはなぜですか?

var canvas = document.getElementById("mijnCanvas"); 
var mijnObject = canvas.getContext("2d"); 

var afbeelding = new Image(); 
var balkX = (canvas.width/2)-50; 
var balkY = canvas.height-100; 

function makenBalkKort() { 
    mijnObject.drawImage(afbeelding, balkX, balkY, afbeelding.width, afbeelding.height); 
} 
afbeelding.src = "Afbeeldingen/BrickSmasher_Balk_Kort.png"; 

function tekenenObjecten() { 
    mijnObject.clearRect(0, 0, canvas.width, canvas.height); 
    makenBalkKort(); 
    drawFrame(); 
} 
setInterval(tekenenObjecten, 20); 

window.addEventListener("keydown", function LinksOfRechts() { 
    mijnObject.clearRect(balkX, balkY, canvas.width, canvas.height); 
    var balkNaarX = 15; 
    var code = event.which || event.keyCode; 
    if(code == 37) { 
     if(balkX > 0) { 
      balkX -= balkNaarX; 
     } 
    } 
    else if(code == 39) { 
     if(balkX < canvas.width-afbeelding.width) { 
      balkX += balkNaarX; 
     } 
    } 
    mijnObject.drawImage(afbeelding, balkX, balkY, afbeelding.width, afbeelding.height); 
}); 

function drawFrame() { 
     mijnObject.beginPath(); 
     mijnObject.fillStyle = "#000000"; 
     mijnObject.strokeStyle = "#000000"; 
     mijnObject.rect(0, 750, canvas.width, 50); 
     mijnObject.fill(); 
     mijnObject.stroke(); 
     mijnObject.closePath();  
} 

はここに私の画像です:

enter image description here

+0

:キャンバスが更新された状態で、できるだけ早く更新していることを確認するために、あなたがしてtekenenObjecten関数を呼び出すsetIntervalの代わりに​​を使用することができます例。 – dangel

+0

と画像(Afbeeldingen/BrickSmasher_Balk_Kort.png)が入っていない – dangel

+0

@dangel私の悪い、私は画像をオンラインに置いて忘れてしまった... JSFiddleのために、私はここでもまだ新しく、それらのすべてのもので動作するように、しかし、コードで言うように画像をアップロードすると、すべてが機能します(ちょうどその点滅するもの):) – KevinN

答えて

1

あなた​​イベントハンドラで大きな四角形をクリアしているので、あなたのイメージが点滅している、とこれの一部は底面積をカバーしています。その後、ボード全体を再描画する関数がキューに入れられるまでに、最大20ミリ秒の遅延があります。しかし、よりよい解決策は、に変更を加え避けるためだろう

mijnObject.clearRect(balkX, balkY, afbeelding.width, afbeelding.height); 

シンプルですが、汚い修正は画像領域のみをカバーする​​ハンドラでクリアされている面積を調整することであろう任意のイベントハンドラのキャンバス。つまり、clearRectdrawImage呼び出しをイベントハンドラから削除します。私は実際に表示するためにJSFiddleまたは似たようなサイトでこれを置くことをお勧め

function tekenenObjecten() { 
    mijnObject.clearRect(0, 0, canvas.width, canvas.height); 
    makenBalkKort(); 
    drawFrame(); 
    requestAnimationFrame(tekenenObjecten); 
} 

requestAnimationFrame(tekenenObjecten); 
+0

私はいつもあなたが矩形をクリアする必要があると思った。私がパワーアップしたように、あなたがレンガを打ったときには数秒間長くなり、clearRectがなければ短いパドルの上に長いパドルが見えます。長いパドル。私の言っていることが分かるよね? – KevinN

+0

@KevinNこれを達成するためにイベントハンドラ内の四角形をクリアすることはできますが、そのような場合をすべて処理しようとすると非常に複雑になります。それはあなたにそれをやろうとする頭痛を与えるでしょう。単一の関数(例えば、 'tekenenObjecten')がキャンバス全体をクリアして短い間隔ですべてを再描画するようにすると、すべてがより簡単になります。例えば、あなたのパワーアップは、パドルイメージが次回の描画で使用する変数を設定することができ、イベントハンドラで再描画する必要はありません –

+0

ありがとうございます。できます ;) – KevinN

関連する問題