2017-11-19 6 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의 작은 선 세그먼트를 얻을 수있다 다음을 콜백이 발생하여 하나를 지워야하고 다른 라인 세그먼트가 이전 라인의 끝 부분에 배치되어야하지만, 대신에 하나의 긴 라인이 생기고 fillRect 호출이 아무 것도하지 않는 것처럼 보입니다.

+0

답변으로 문제가 해결되지만 다소 잘못되었습니다. 루프 함수를 호출하려면'requestAnimationFrame'을 사용하십시오. 'canvas'와'ctx' 속성을위한'init'에서 객체를 생성하는 것은 중복되고 어쨌든 당신은 그것들을 덮어 씁니다. 두 줄을'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