Win32 API 기초 : Object (2)
플레이어 또는 몬스터가 발사할
발사체를 만들어 보겠습니다.
우선 CObject 클래스를 상속받은
자식 클래스 CMissile을 만듭니다.
CMissile 클래스의 헤더 파일을 보시면
멤버로 m_fDir을 두고 있는데
이는 발사체가 발사될 방향을 나타냅니다.
SetDir 함수는 m_fDir의 값을
설정하기 위한 함수입니다.
발사체는 원형으로 할 것이기 때문에
부모 클래스에 존재하는 render 함수도
가상 함수로 선언하여 CMissile 클래스로
만든 객체를 통해 render 함수를 호출하면
CMissile 클래스 내의 render 함수가 호출되도록
하겠습니다.
이렇게 함으로써 render 함수가 호출되면
오브젝트가 사각형으로 그려졌지만
발사체는 render 함수를 따로 구현하였기
때문에 발사체 오브젝트는 원형으로 그려질 겁니다.
CMissile 클래스의 소스 파일을 보시면
15번째 줄에 SetDir 함수의 정의가 있습니다.
인자로 true를 받으면 m_fDir의 값을 -1로,
false를 받으면 m_fDir의 값을 1로 설정합니다.
23번째 줄에 있는 update 함수는
우선 GetPos 함수를 통해 발사체 오브젝트가
생성된 위칫값을 얻습니다.
플레이어의 발사체의 경우 위로 발사될 것이기 때문에
m_fDir의 값이 -1일 겁니다.
27번째 줄에서 속도를 600으로 설정하고 방향은
-1, 즉 초당 -600을 이동하게 됩니다.
이 값을 발사체 오브젝트 y 좌푯값과 더하여
대입한 후 SetPos 함수를 통해 좌푯값을 적용하면
발사체 오브젝트는 점점 위로 올라가게 되어
마치 발사되는 것처럼 보이겠죠.
32번째 줄에 render 함수는
HDC형 _dc를 인자로 받습니다.
_dc를 통해 그리기 작업이
수행될 목적지를 파악합니다.
render 함수는 발사체를 그리는 함수로,
_dc에 담긴 윈도우에 ELLipse 함수를 통해
원형 오브젝트를 그리게 됩니다.
우선 플레이어의 발사체부터 작성해 봅시다.
아래 코드는 CPlayer 클래스의 소스 파일입니다.
31번째 줄에 있는 코드를 통해
스페이스 바가 입력되면
CreateMissile 함수가 호출됩니다.
이때 매크로를 통해 키 입력에 대한 인식을
조금 더 간결하게 표현했습니다.
KEY_CHECK 매크로는
인자로 받은 키 값이 인자로 받은 상탯값과
같은 상태인지 확인합니다.
같으면 true, 다르면 false를 반환하겠죠.
17번째 줄에 있는 매크로는
KEY_CHECK 매크로를 이용하여
인자로 받은 키 값이 HOLD 상태인지 확인합니다.
18번째 줄에 있는 매크로는
KEY_CHECK 매크로를 이용하여
인자로 받은 키 값이 TAP 상태인지 확인합니다.
19번째 줄에 있는 매크로는
KEY_CHECK 매크로를 이용하여
인자로 받은 키 값이 AWAY 상태인지 확인합니다.
20번째 줄에 있는 매크로는
KEY_CHECK 매크로를 이용하여
인자로 받은 키 값이 NONE 상태인지 확인합니다.
다시 CPlayer 클래스의 소스 파일로 돌아와
CreateMissile 함수의 정의를 보면
GetPos 함수를 통해 플레이어의 좌푯값을
vPos에 저장합니다.
GetScale 함수를 통해 플레이어의 크기를 얻고
이 값을 반으로 나누어 vPos의 y 좌푯값과
빼 준 후 이를 vPos의 y값으로 합니다.
이 코드는 GetPos를 통해
플레이어의 중심 좌푯값을 얻고,
중심 좌푯값에서 플레이어 크기의 절반만큼
위쪽으로 이동한 좌표값을 발사체의
첫 위치로 하기 위한 코드입니다.
플레이어의 앞쪽 부분에서 발사체가 발사되겠죠.
45번째 줄에서 CMissile형 포인터를
선언하고 동적 할당을 진행합니다.
CMissile형 포인터가 가리키는 공간에
존재하는 발사체의 위치를 SetPos 함수를 통해 설정하고
SetScale 함수를 통해 크기를 설정합니다.
SetDir 함수를 통해 발사체의 방향을 설정합니다.
true를 인자로 넘겼으므로 방향은 -1,
즉 위쪽 방향으로 발사체가 움직일 겁니다.
발사체 오브젝트가 화면에 나오려면
발사체 오브젝트를 현재 씬이 갖고 있도록
해야겠죠.
CSceneMgr 클래스,
즉 씬 매니저가 현재 가리키고 있는 씬은
멤버 m_pCurScene에 저장되어 있죠.
이 m_pCurScene 멤버를 반환하는
GetCurScene 함수를 통해
현재 씬을 pScene가 가리키도록 하고
pScene이 가리키는 씬에 AddObject 함수를 통해
위에서 만든 발사체 오브젝트를 저장합니다.
이제 프로그램을 실행한 후 스페이스 바를 누르면
플레이어 오브젝트의 앞쪽에서 발사체가
발사되는 것을 확인할 수 있습니다.
강의 출처 : https://www.youtube.com/watch?v=29qL7KQ-Blw