2017-11-19 17 views
0

をクリアしていないことは、非常に単純な問題のように思えるし、私はちょうど何かを見下ろすが、このコードでなければなりません。キャンバスの背景

window.onresize = function(){ 
    init.canvas.width = window.innerWidth; 
    init.canvas.height = window.innerHeight; 
} 
var init = { 
    canvas: new Object(), 
    ctx: new Object(), 
    constructCanvas: function(){ 
    this.canvas = document.getElementById("canvas"); 
    this.ctx = this.canvas.getContext("2d"); 
    this.canvas.width = window.innerWidth; 
    this.canvas.height = window.innerHeight; 
    } 
} 
init.constructCanvas(); 

var a = 20; 
var b = 20; 
init.ctx.lineWidth = 4; 
function loop(){ 
    init.ctx.fillStyle = "Blue"; 
    init.ctx.fillRect(0,0,init.canvas.width,init.canvas.height); 
    init.ctx.moveTo(a,b); 
    init.ctx.lineTo(a+=9,b); 
    init.ctx.stroke(); 
} 
setInterval(loop,100); 

起こっべきである何をするとき、次の私は、長さ9の小さな線分を取得していますコールが発生して、クリアする必要があり、別の線分を前の行の最後に置く必要がありますが、代わりに1つの長い行があり、fillRectの呼び出しが何もしないようです。

+0

答えはあなたの問題を解決しますが、あなたは間違っているいくつかのものをやっています。ループ関数を呼び出すには 'requestAnimationFrame'を使います。 'canvas'と' ctx'プロパティのために 'init'でオブジェクトを作成することは冗長で、とにかくそれらを上書きします。 2つの行を 'constructCanvas'関数で作成するときに削除してください。また 'new Object()'は '{}'と同じです。 'window.setInterval'でwindowを使うのではなく、なぜ' innerWidth'、 'innerHeight'、' onresize'でwindowを使うのですか? 'window'は常にデフォルトスコープです。あなたがグローバル変数を強制しない限り、それを使う必要はありません。 – Blindman67

答えて

1

これはbeginPath()を使用しない場合に起こる多くのキャンバス問題の一つである:

キャンバスが適切にクリアされません。ただし、パスを決してクリアしないので、必要なセクションだけでなく、ライン全体を常に再描画します。 moveTolineToを呼び出すことによって、既に作成されたパスに次のセクションを追加するだけです。strokeに描画されます。代わりに、新しいパスを開始する必要があります。

function loop(){ 
    init.ctx.fillStyle = "Blue"; 
    init.ctx.fillRect(0,0,init.canvas.width,init.canvas.height); 

    init.ctx.beginPath(): 
    init.ctx.moveTo(a,b); 
    init.ctx.lineTo(a+=9,b); 
    init.ctx.stroke(); 
} 
+0

これで、beginPathを呼び出すことなく、moveToが効果的に無視されますか? – Joking313

+0

いいえ、まだ効果的な変更はありませんでした。そのキャンバス上のブラシの線を想像してみてください。 'moveTo'は最後の行が終了した位置にブラシを移動します。しかし、あなたはまだ新しい道を開いていないので、ブラシはすでにそこに座っていました。 'moveto'は新しいパスを作成しません。ブラシを持ち上げ、新しい位置に移動します。 'beginPath'を使用すると、最後のブラシの位置に関する情報が失われ、今度はそれを移動する必要があります。 – Syntac

関連する問題