리듬 게임 을 만들 어 보 자 1 . 메세지 루프 와 D 3 D 장치 만들 기 : : 나 의 큰 O 는 logx 야 . . 
 리듬 게임 을 만들 어 보 자 1 . 메세지 루프 와 D 3 D 장치 만들 기 
 2009 . 11 . 19 23 : 03 프로그래밍 / 스 페샬 
 MidiGalaxy - 01 . zip 
 프로젝트 를 하나 만들 자 . 내 프로젝트 의 이름 을 거창 하 게 MidiGalaxy 라고 짓 겠 다 . 
 게임 의 가장 기초 가 될 유일무이 한 클래스 GGame 클래스 를 만들 겠 다 . 
 GGame 클래스 는 전반 적 인 D 3 D 장치 와 메세지 루프 를 관리 할 것 이 다 . 
 Direct 3 D 를 사용 하 기 위해서 는 ' d 3 dx 9 . h ' 라는 헤더 파일 이 필요 하 다 . 
 그리고 ' d 3 d 9 . lib ' 와 ' d 3 dx 9 d . lib ' 라는 라이브러리 파일 도 필요 하 다 . 
 D 3 D 프로그래밍 을 할 때 는 빼먹 지 않 고 반드시 추가 하 도록 하 자 . 
 D 3 D 장치 를 생성 하 는 Create 3 DDevice 함수 이 다 . 
 Direct 3 D 장치 를 생성 하 는 단계 는 다음 과 같 다 . 
 1 . 먼저 Direct 3 DCreate 9 함수 를 호출 하 여 IDirect 3 D 9 를 얻 는다 . 
 2 . IDirect 3 D 9 의 CreateDevice 함수 를 호출 하 여 IDirect 3 DDevice 를 얻 는다 . 
 CreateDevice 함수 를 호출 할 때 우리 가 만들 장치 의 속성 을 지정 해 준다 . 
 GGame : :_ getdpp 함수 가 우리 가 만들 장치 의 속성 을 구한다 . 
 D 3 DPRESENT _ PARAMETERS 라는 구조 체로 장치 의 속성 이 정의 되 는데 
 필드 이름 만 봐도 무슨 역할 을 하 는지 쉽 게 알 수 있 다 . 
 BackBufferWidth : 백 버퍼 의 가로 길 이 
 BackBufferHeight : 백 버퍼 의 세로 길 이 
 BackBufferFormat : 백 버퍼 의 포맷 
 다시 본론 으로 돌아가 서 Create 3 DDevice 함수 에서 는 D 3 D 장치 를 얻 은 후 에 
 ID 3 DXSprite 까지 만들 고 있 다 . 
 ID 3 DXSprite 는 D 3 D 에서 2 D 출력 을 간편 하 게 할 수 있 도록 제공 하 는 인터페이스 이 다 . 
 D 3 DXCreateSprite 함수 를 통해 생성 할 수 있 다 . 
 이것 이 우리 게임 을 작동 시키 는 기초 가 될 메세지 루프 부분 이 다 . 
 일반 윈도우 프로그램 메세지 루프 에서 는 GetMessage 함수 를 사용 하 지만 , 게임 용 메세지 푸르 에서 는 PeekMessage 함수 를 사용 한다 . 
 두 함수 의 차이점 은 
 GetMessage 함수 는 큐 에 메세지 가 없 으면 메세지 가 들어올 때 까지 계속 기다리 지만 , 
 PeekMessage 함수 는 큐 에 메세지 가 없 으면 즉시 0 을 리턴 한다는 것 이 다 . 
 게임 프로그램 은 메세지 가 있 던 없 던 상관 없이 늘 일정 한 속도 로 매초 에 수십 개 의 프레임 을 처리 해야 한다 . 그러므로 GetMessage 함수 대신 에 PeekMessage 함수 를 쓸 수 밖 에 없 다 . 
 메세지 가 없 을 경우 에 는 첫 번 째 else 부분 으로 들어온다 . 먼저 OnProc 함수 를 호출 한다 . OnProc 함수 에서 는 매 프레임 마다 처리 해야 할 것 들 을 처리 한다 . 
 만약 장치 를 잃 은 상태 라면 ( islost 가 참 이 라면 ) Reset 3 DDevice 를 호출 해 , 장치 를 복구 하 려고 한다 . 만약 장치 복구 에 성공 했 다면 OnReset 함수 를 호출 한다 . OnReset 함수 에서 는 장치 가 복구 되 었 을 때 , 해야 할 것 들 을 처리 한다 . 
 그리 기 를 생략 한다면 ( m _ drawskip 이 참 이 라면 ) OnDrawSkip 을 호출 한다 . 종종 부하 가 걸려서 초당 프레임 횟수 를 맞추 지 못할 때 가 있 다 . 그럴 때 는 과감 하 게 그리 기 를 생략 하 고 , 다음 프레임 으로 넘어가 야 한다 . 
 그리 기 를 생략 하 지 않 았 고 , 장치 도 정상 적 이 라면 그리 기 는 것 을 시작 한다 . 
 D 3 D 의 기본 적 인 그리기 과정 은 다음 과 같 다 . 
 1 . IDirect 3 DDevice 9 : : Clear 로 화면 을 깨끗이 지운다 . 
 2 . IDirect 3 DDevice 9 : : BeginScene 으로 그리 기 를 시작 한다 . 
 3 . 열심히 그린다 . 
 4 . IDirect 3 DDevice 9 : : EndScene 으로 그리 기 를 마친다 . 
 5 . IDirect 3 DDevice 9 : : Present 로 그린 것 을 화면 으로 전송 한다 . 
 먼저 IDirect 3 DDevice 9 : : Clear 함수 를 사용 하 여서 화면 을 깨끗이 지워 준다 . 
 세 번 째 인자 로 색깔 을 지정 해 줄 수 있 다 . 색깔 을 지정 해 줄 때 는 D 3 DCOLOR _ XRGB 나 D 3 DCOLOR _ ARGB 매크로 를 사용 하 면 편리 하 다 . 
 그 다음 IDirect 3 DDevice 9 : : BeginScene 함수 를 호출 해서 그리 기 를 시작 한다 . 
 함수 가 실패 했 다면 그릴 수 가 없 으므로 넘어간다 . 
 이제 그리 기 를 시작 하 자 . 
 ID 3 DXSprite 인터페이스 를 2 D 그리 기 를 쉽 게 할 수 있 게 도와 준다고 했 다 . 
 ID 3 DXSprite 를 이용 해 화면 에 2 D 를 그리 려면 몇 가지 해야 할 일 이 있 다 . 
 1 . ID 3 DXSprite : : Begin 함수 를 호출 해서 그리 기 를 시작 한다 . 
 2 . 열심히 그린다 . 
 3 . ID 3 DXSprite : : End 로 그리 기 를 마친다 . 
 단 , 이 모든 과정 은 IDirect 3 DDevice 9 의 BeginScene 과 EndScene 사이 에서 들어가 야 한다 . 
 ID 3 DXSprite : : Begin 함수 의 인자 로 넘겨 준 D 3 DXSPRITE _ ALPHABLEND 는 그리기 할 때 알파 블 렌 딩 을 사용 할 것 임 을 뜻 한다 . 
 OnDraw 함수 에서 는 화면 에 그리 는 일 을 담당 한다 . 
 IDirect 3 DDevice 9 : : EndScene 을 호출 하 여 그리 기 를 마무리 하 고 , 
 IDirect 3 DDevice 9 : : Present 를 호출 하 여 화면 에 전송 을 한다 . 
 단 이 때 몇 가지 문제 가 발생 할 수 있 다 . 가끔 장치 를 잃 어 버리 는 경우 가 있 다 . 이 때 는 장치 를 이용 하 던 것 들 을 잠시 해제 해 놓 고 , 장치 를 복구 한 뒤 , 다시 복구 시켜야 한다 . 
 OnLost 함수 에서 는 장치 를 사용 하 는 것 들 을 해제 하 는 일 을 담당 한다 . 
 그리고 그 리기 를 마치 고 OnPostProc 함수 를 호출 한다 . OnPostProc 함수 는 그리 기후 뒷 처리 를 담당 한다 . 
 OnLost 함수 와 OnReset 함수 이 다 . 
 ID 3 DXSprite 와 같 은 인터페이스 는 IDirect 3 DDevice 9 장치 를 이용 한다 . 그러므로 장치 를 잃어버렸 을 경우 에 는 OnLostDevice 를 호출 하 여 해제 하 고 , 장치 를 복구 했 을 때 는 OnResetDevice 를 호출 하 여 다시 원상 복구 시킨다 . 
 D 3 D 에서 이 처럼 장치 를 잃 었 을 때 와 복구 했 을 때 특별히 처리 를 해 주 어야 하 는 것 들 이 있 는데 , 그 들 은 모두 OnLostDevice 와 OnResetDevice 함수 를 가지 고 있 다 . 그러니까 이런 함수 를 가지 고 있 는 놈 들 은 장치 를 잃 었 을 때 , 복구 했 을 때 이 함수 들 을 꼭 호출 해 줘야 한다 . 
 메인 함수 부분 이 다 . 윈도우 를 생성 한 뒤 GGame 클래스 를 얻 어서 장치 를 생성 하 고 있 다 . 
 GGame 클래스 는 이 프로그램 전체 에서 단 하나 만 생성 되 어야 한다 . 
 이럴 경우 GGame 클래스 의 생성자 를 protected 나 private 로 설정 하 면 , GGame 클래스 외부 에서 는 GGame 인 스턴스 를 생성 할 수 없 게 된다 . 그리고 static 함수 로 GetInstance 함수 를 만들 어 놓 아서 유일 한 인 스턴스 를 반환 하 게 한다 . 이렇게 하 면 프로그램 전체 어디 서 에서 도 GetInstance 함수 를 통해서 유일 한 인 스턴스 를 얻 을 수 있 게 된다 . 흔히 이런 것 을 가리켜 싱글턴 ( Singleton ) 패턴 이 라고 한다 . 
 « 이전 1 · · · 469 470 471 472 473 474 475 476 477 · · · 509 다음 »