캔버스
애니메이션 멈추기
- return 이용, 내부에서 실행할때
- cancelAnimationFrame 이용, 외부에서 실행할때
- clearInterval, setInterval로 구현시
function draw() {
count++;
if(count%30 === 0){
// 기존 원 지우기 : 빼먹으면 잔상 다 그려짐
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
// 새로 원 그리기
context.arc(xPos, 150, 5, 0, Math.PI*2, false);
context.fill();
xPos += 5;
}
// $1. 애니메이션 멈추는 방법 -> return 이용, 내부에서 실행할때
if(xPos >= canvas.width-10) return;
// 그릴 함수를 콜백으로 계속 호출한다.
timeId = requestAnimationFrame(draw);
// if(xPos >= canvas.width-10) cancelAnimationFrame(timeId);
}
draw();
canvas.addEventListener('click', () => {
// $2. 애니메이션 멈추는 방법 -> cancelAnimationFrame 이용, 외부에서 실행할때
cancelAnimationFrame(timeId);
});
이미지 사용하기
drawImage(image, dx, dy);
- 이미지 크기 그대로 좌표에 배치함
drawImage(image, dx, dy, dWidth, dHeight);
- 이미지 크기를 변경해서 좌표에 배치함
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
- 이미지 내부에서 크롭해서 가져옴
결과이미지
const imgElem = new Image();
imgElem.src = '../images/ilbuni1.png';
// 이미지 객체를 불러오고 나서야 그리는 것이 가능
imgElem.addEventListener('load', () => {
context.drawImage(imgElem, 50, 50);
// 매개변수 5개(이미지객체, 배치할좌표X, 배치할Y좌표, 너비, 높이)
context.drawImage(imgElem, 50, 50, 70, 120);
// 매개변수 9개(이미지객체, 땡길X좌표[크롭], 땡길Y좌표[크롭], 가져올너비, 가져올높이,
// 배치할좌표X, 배치할Y좌표, 너비, 높이);
context.drawImage(imgElem, 50, 50, 200, 200, 100, 300, 100, 100);
});
클릭한 위치에 그리기
click의 event 객체의 속성
- clientY : 브라우저 기준 클릭한 y좌표
- layerY : 캔버스 기준 클릭한 y좌표
let drawingMode; // true일때만 그리기
function downHandler(e) {
drawingMode = true;
}
function upHandler(e) {
drawingMode = false;
}
// 클릭한 위치에 그림그리기
function moveHandler(e) {
if(!drawingMode) return;
context.beginPath();
context.arc(e.layerX, e.layerY, 10, 0, Math.PI*2, false);
context.fill();
}
canvas.addEventListener('mousedown', downHandler);
canvas.addEventListener('mousemove', moveHandler);
canvas.addEventListener('mouseup', upHandler);
이미지 저장하기
canvas.toDataURL(이미지확장자)
- 캔버스 객체의 url을 가져올수 있음
- image 객체에 src에 넣으면 캔버스를 그림으로 출력가능
const url = canvas.toDataURL('image/png');
const imgElem = new Image();
imgElem.src = url;
https://www.youtube.com/watch?v=ovf8cbKtBH0&list=PLe9WXHRkq9p2Yl0z2zskv-FhP5sinISTc&index=2
'Ecmascript > Canvas' 카테고리의 다른 글
[테트리스 만들기] 테트리스 기능 구현(다음 블록 생성, 한줄 채우면 사라지고 점수 증가) (0) | 2020.01.19 |
---|---|
[테트리스 만들기] 레이아웃부터 모션까지 제작 (0) | 2020.01.12 |
캔버스와 비디오 (0) | 2019.12.18 |
캔버스 #01 그리기와 애니메이션 원리 (0) | 2019.12.15 |
캔버스 기초 (0) | 2019.12.07 |