입방체 베지에 곡선을 사용하여 만든 직선에 잔디처럼 굽히기 위해 노력하고 있습니다. 베 지어 곡선을 사용하여 직선을 만들었으니 이제는 위로부터 구부릴 것입니다.하지만 제가 직면하고있는 문제는 나는 그것을 할 수 없다 동적으로. 내가 벤드를 만들기 위해 mousemove를 사용하는 순간, 일련의 커브가 캔버스에 원하는 모양이 아닌 페인트 같은 것을주는 것처럼 보입니다. 나는 단지 하나의 곡선을 원합니다. 내 질문 그려진 이전 선을 지우고 최신 굽은 곡선을 복원하는 방법은 무엇입니까 ?? 내 코드 : here is my code if you want to have a look at it베 지어 곡선을 동적으로 생성 하시겠습니까?
0
A
답변
1
서로의 상부에 적층 된 두 캔버스를 만든다.
이 방법을 사용하면 잔디가 그려진 영역을 지우는 것에 대해 걱정할 필요가 있습니다. (또한 항상 정적으로 다시 그릴 필요가 없기 때문에 훨씬 빠릅니다.)
두 개의 캔버스를 위치를 relative로 설정 한 div 안에 넣은 다음 절대 값을 position으로 설정하여 캔버스를 배치하십시오.
이제 정적 콘텐츠를 그리는 기능을 만들 수 있습니다 (브라우저 창의 크기가 조절되면 다시 그려야합니다.).
잔디가 그려지는 영역을 기록하고 다음 프레임의 각 잔디마다이 부분 만 지 웁니다. 이 마지막이 너무 복잡하면
, 그냥 "동적"캔버스에 단순 명확를 사용 : 당신이 좋아하는 경우는이 캔버스의 투명성, 또는 "레이어"를 유지합니다
ctxDyn.clear(0, 0, canvasDyn.width, canvasDyn.height);
.
실제 애니메이션을 수행하려면 requestAnimationFrame을 사용하십시오.
var isPlaying = true;
function animate() {
ctxDyn.clear(0, 0, canvasDyn.width, canvasDyn.height);
drawGrass(); //function to draw the actual grass
if (isPlaying) requestAnimationFrame(animate);
}
animate(); // start
isPlaying
requestAnimationFrame
의 링크를 참조하십시오. 아직까지는 "젊은"구현이므로
dynCtx
및 dynCanvas
물론 원하는대로 부를 수 있습니다.
0
업데이트 된 "잔디"를 다시 그리기 전에 캔버스의 현재 내용을 지워야합니다. 이것은 캔버스에 "정적"인 다른 모든 것을 다시 그려야합니다. 예 :
function redraw() {
// Erase the current contents
ctx.fillStyle = 'white';
ctx.fill(0, 0, canvas.width, canvas.height);
// Draw the stuff that does not change from frame to frame
drawStaticContent();
// Draw the dynamic content
drawGrass();
}
mousemove
이벤트에서 잔디 곡선 정보를 업데이트 한 다음 다시 그립니다.
정적 콘텐츠 만 다른 동적 콘텐츠를 포함하는 첫 번째 :