시작
MDN에서는 JS 객체의 실습을 해보라고 Canvas API를 이용한 예제를 제공한다. 공이 날아다니는 걸 구현해보는 예제인데 생각보다 재미있다.
1. 기본 구조
1.1. HTML
다음과 같은 HTML을 만든다.
1.2. JS
그리고 여기에 있는 css, js 파일을 복사하자. 스크롤바를 숨기고 캔버스를 화면에 꽉 차게 만들며 기본적인 함수 선언이 된 코드다.
그리고 JS 파일에 다음처럼 공 클래스를 작성한다.
이제 Ball 클래스 생성자를 통해 공을 만들고 ball.draw()
를 호출하면 공을 그릴 수 있다. 그리고 공의 위치를 업데이트하는 함수를 클래스 내에 작성한다. 공이 벽에 부딪쳐서 튕겨나오는 것을 구현한 것을 볼 수 있다.
이제 공들을 캔버스에 만들어 보자. 다음 코드는 랜덤하게 위치와 속도, 크기를 지정한 공을 만들고 캔버스에 그리는 코드다.
이를 브라우저에서 열어보면 검은 배경에 공들이 움직이는 걸 볼 수 있다.
2. 충돌 구현
충돌도 구현해보자. 다음 메서드를 Ball 생성자에 추가한다.
그리고 loop 함수의 모든 공을 순회하는 부분에 공 각각의 collisionDetect 메서드를 호출하도록 추가한다.
공들이 화면에서 서로 부딪히면 색이 바뀌는 걸 볼 수 있다.
3. 예제 발전시키기
3.1. 사용자 조작 기능
사용자가 조작할 수 있는 공을 추가하고 거기에 공이 닿으면 공이 사라지도록 해보자. 또한 클래스 설계를 좀더 잘해보자.
먼저 사용자가 조작할 수 있는 공과 그냥 공이 상속받을 일반적인 Shape
클래스를 정의하자. Shape
클래스는 Ball
클래스와 EvilCircle
클래스의 공통점인 위치와 속도만을 담는다.
그리고 Ball
클래스가 Shape를 상속받는 걸로 하고 생성자를 바꾸자. canvas에 공이 존재하는지를 뜻하는 exists 프로퍼티도 추가하고 충돌 감지 함수도 exist 시에만 체크하도록 변경한다.
이제 사용자가 조작할 공, 공을 먹어치우는 EvilCircle을 정의하자. EvilCircle은 Shape를 상속받고, 공을 먹어치우는 메서드를 추가한다. 이런 공은 하나밖에 없을 예정이긴 하지만 연습을 위해 클래스를 사용한다. 예제에서 시키는 그대로 하면 된다.
그리고 evilCircle을 생성하고 loop 함수에 추가하자.
3.2. 공 개수 표시하기
이제 공의 개수를 화면에 표시해 보자. h1 요소 아래 p태그를 배치한다. 스타일링은 예제에 있는 걸 복사하자.
그리고 공의 개수를 loop 함수의 호출마다 세주어서 p 태그의 내용을 업데이트한다.
이다음 브라우저에서 실행해 보면 유저가 w,a,s,d로 컨트롤할 수 있는 하얀색 원이 생기고, 공을 먹어치우면 공의 개수가 줄어드는 걸 볼 수 있다.
참고
객체 만들기 실습 https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_building_practice
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Adding_bouncing_balls_features