저번 까지는 화면에 우주선을 움직이게 까지 했다.
이번에는 게임의 하이라이트 충돌이다.

물체간에 부딛히는 것을 인식하게 하는 것이다.
여기에는 실제로 많은 물리 지식과 수학적 지식이 필요하다.
나도 책을 여러번 읽고 이해를 할 수 있었다.
여기에 충돌에 관한 물리적 내용을 다루지는 않을 것이다.
실제 자세한 구현과 코드의 내용을 보려면 직접 책을 참고하는 것이 좋을 것이다!
(2d 게임 프로그래밍, 찰스 켈리)

이 글의 목적은 게임 상의 우주선이 게임 화면 안에서 갇혀있는 것이다.
우주선이 왔다리 갔다리 하는데 화면 끝으로 이동했을 때 넘어가는 것이 아니라
공이 벽에 튕기듯이 튕겨서 게임 화면 안에서 계속 돌아댕기는 프로그램을 만들 것이다.

충돌을 다루기 위해 벡터를 사용해야한다.
DirectX에서 제공하는 벡터 타입이다.
벡터 연산들도 제공한다.

그러나 이름이 길고 쓰기 불편하므로 우리가 이해하기 쉽게 간단한 이름으로

캡슐화 시켰다.


(벡터 재정의)



(벡터 연산)


위와 같이 벡터 타입과, 벡터 연산들을 우리가 사용하기 편하게 함수안에 넣어두었다.

그 다음 충돌을 다루게 하기 위해 Entity 라는 이름의 클래스를 만들어 볼 것이다.
Entity는 해석하면 객체이지만, 여기서는 고유명사처럼 Entity라고 말할 것이다.

Entity는 우리가 충돌을 인식하게 하기 위해 우리가 원하는 객체들을 Entity 클래스로 선언할 것이다.

그리고 각종 충돌에 관한 함수들을 집어 넣을 것이다.



(entity 이름 영역)


Entity의 이름 영역에는 충돌타입과 중력상수가 적혀있다.
충돌 타입은
원형 충돌
사각형 충돌
회전 사각형 충돌
복합 충돌
으로 구분할 수 있다.

그러한 것들을 이름영역에 정의해두었다.

다음은 Entity 클래스의 속성 변수들을 볼 것이다.



(속성 변수)


가지고 있는 속성 변수에는 위와 같다.

그리고 protected 영역에 선언된 함수들이다.



(protected 함수)


위 함수들은 다른 클래스 밖에서 호출되지 않고 내부에서만 호출되게 하기 위해 protected 안에서 선언되어있다.

이제 public 영역의 함수들을 볼 것이다.



(생성자)


생성자이다.
초기값들을 설정하는 부분이다.

다음으로는 초기화 함수이다.



(초기화 함수)


초기화 함수가 조금 특이하다.
첫번째 인자가 게임포인터라는 것만 빼면 Image의 초기화 함수랑 똑같다.
심지어 내부에서 Image의 초기화 함수를 호출한다.

게임 포인터에서 입력을 input으로 저장해둔다.
게임 중 입력 받아놓은 지역변수 값들을 가져와서 저장해두는 역할을 한다.

(activate() & update())


activate() 함수는 Entity 객체가 충돌관련 연산이 일어나게 할지 활성화 여부를 활성화 시키는 것이다.

update 함수는 계산된 속도 변화를 적용시킨다.
이전에 충돌과 관련된 계산이 끝난 후 변화 속도를 deltaV에 저장해 두고 여기서 적용시킨다.

그 후 Image의 update를 호출한다.


(ai 함수)


AI 함수는 인공지능에 관련된 함수이다.
지금 현재 우리의 객체에는 인공지능이 들어가지 않는다.
그렇지만 Entity 클래스의 객체를 인스턴스화 할 수 있게 하기 위해 빈 함수로 제공해둔다.

이렇게 하면 Entity 클래스에서 객체를 직접 생성할 수 있다.



(충돌 함수)


충돌에 관련된 함수이다.
위 함수는 각 객체의 충돌 타입을 확인 한 후 각 객체의 충돌 타입에 맞게 다시 충돌탐지 함수들을 호출한다.
각 충돌 탐지에 관한 함수들, 내용들은
시간이 된다면 따로 정리해서 올릴 예정이다.

그 후 이 전까지와 달라진 점이 있다.
이젠 Entity를 사용해 각 객체를 호출 할 것이다.
그러기 전에 행성과 우주선이라는 클래스를 따로 만들 것이다.
그리고 이 우주선과 행성 클래스는 Entity 클래스를 상속한다.
우주선과 행성 클래스를 따로 만드는 이유는 각 객체의 값들을 따로 관리하는게 좋기 때문이다.
여기저기 섞여 있는 것보다는!

planet 부터 보자!


(planet 헤더)


헤더 파일에 planet 의 속성들이 들어있다.



(planet 생성자)


생성자는 간단히 이름영역에서 설정한 값들을
변수에 초기값으로 설정하는 역할을 한다.

다음은 ship 클래스이다.


(ship 헤더)


planet 과 같이 속성 설정값들이 있다. ( 이 값들은 애니메이션과 관련된 설정들도 있고 지난 글들에서 다루어왔던 값들이므로 설명은 생략하겠다. )

planet과 다른점은 update 함수가 있다.

이 update 함수는 우주선이 벽에 부딛히고 튕겨져 나오는 것을 작성하기 위해 여기서 상속받아서 작성하였다.


(ship의 생성자)


planet과 마찬가지로 ship의 생성자 또한 이름영역에서 설정된 값들을 가지고 초기값을 설정하며 만들어진다.



(update 함수)


update 함수이다.
이 함수에서는 맨 먼저 Entity 의 update가 실행된다. Entity의 update에서 충돌 결과의 움직임이 적용이 되고 Image의 update가 실행이 된 후이다. 마지막으로 화면에 그려지기 전에 이루어지는 update이다.

Entity의 update에서 적용된 속도 값들을 이용하여 해당 우주선의 화면상 위치를 잡는 모습이 보이고
추가적으로 우주선이 천천히 뱅글뱅글 돌아가도록 spriteData의 angle 값을 바꾸고 있는 모습도 보인다.

그 뒤로 이제 화면에 부딛히는 과정을 체크한 후 부딛히면 날라온 방향에서 부딛힌 축에 뒤집히게 -1을 곱하여 반대로 뒤집어준다.

이제 실제 spacewar 파일에서 우주선과 행성 등을 다시 선언해주어야한다.
이 전까지는 Image로 선언했기 때문이다.



(재선언)


이 때 우주선은 Ship으로 행성은 Planet으로 선언했다.
둘 모두 Entity를 상속했고 Entity이고 Entity 는 Image를 상속했다.

실행해보면 우주선이 게임화면에서 계속 튕기면서 돌아댕기는 모습을 볼 수 있다.



(우주선 표류)



(우주선 표류)


다음에는 두 객체가 충돌하는 것에 관련해서 알아볼 것이다.
아까 Entity에서 충돌에 관련해 만들어두었지만 아직 안썼었다.

(* 참조 - 2d 게임 프로그래밍, 찰스 켈리)

+ Recent posts