|
|||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
|
|
보통 도스용 게임을 제작할때는 하드웨어적인 것을 개발해야
하
거나 (속도 문제로...) 상업적인 라이브러리를 사서 제작하는
경우가 다수였을 겁니다.
그리고, 멀티 테스킹을 하기 위한 자구책을 내놓기도 하였죠~
당연 이것을 얍삽한 프로그램방식이라고들 일부에서는 표현하면
서 사용을 했죠~
윈도우즈는 어떨까요? 사실 멀티테스킹, 네트워크상의
플레이,
사운드의 다양한 제어, 거기다 3차원 방법까지 쉽게 신경쓰지
않고 표현할수 있는 시대인것 같습니다.
잉? 자꾸 삼천포로 빠지는 군요~
1. 프로세서를 독점하기
일단 게임을 위해서는 프로세서를
독점할 필요성이 있겠다
고 생각하시죠? 당연 다이렉트로
이것을 사용자가 만들기
바라지 않고 자체 에서 지원합니다.
바로
SetCooperativeLevel()이라는
대표적인 함수가 있습니다.
─────────────────────────────
HRESULT SetCooperativeLevel(LPDIRECTDRAW lpDD, HWND
hWnd,
DWORD
dwFlags)
─────────────────────────────
lpDD는 앞에서 생성된 DirectDraw
객체에 대한 포인터를
뜻합니다. 두번째것은 당연 윈도우즈
핸들러겠죠?
보통 이헨들러는 작업전환(ALT+TAB)에
관한 메세지를 보낼
때 사용되어 집니다.
마지막 dwFlags에 관한건 다음의
내용을 보시면 설명보다
쉽게 이해가...
--------------------------------------------------------------
DDSCL_ALLOWMODEX ModeX를 지원한다. DirectDraw는 저해상도인
320x200,
3200x400의 X모드를 지원합니다.
DDSCL_ALLOWREBOOT 전체 화면을 사용할때 Ctrl+Alt+Del을 가능하
합니다.
DDSCL_EXCLUSIVE 해상도를 바꾸거나 플리핑 작업을 위해서
exclusive
level 상태로 한다.
DDSCL_FULLSCREEN GDI를 사용하지 않는 전체화면 모드를 사용
가능하게
한다.
DDSCL_NORMAL 일반적인 윈도우즈 창에서
프로그램을 가능
하게
합니다.
DDSCL_NOWINDOWCHANGES 활성화 상태에 있는 프로그램을 minimize
할수
없게 합니다.
--------------------------------------------------------------
와우 무슨 옵션이 이렇게 많은가?
보통 프로그램에서는
위의 코드를 조합해서 사용합니다.
여기서 조합이란것은
OR, AND를 한다는 뜻입니다.
간단한 예를 보죠~
ddrval=lpDD->SetCooperativeLevel(hwnd,
DDSCL_EXCLUSIVE
| DDSCL_FULLSCREEN);
아주 간단해 보이시죠?
2. 비디오 모드 설정
앞서 배운 것은 단지 프로세서(CPU)자원의
독점하는 것을
배워 보았습니다.
이번에는 비디오 모드를 설정하는
방법을 알아 봅시다.
물론 관련책자를 보시면 자세히
알수 있지만, 그래도...
혹시나... 책이 없이 이글로 배움을
시작하는 분을 위해
다이렉트는 320x200, 320x400
640x480의 해상도를 지원합
니다. 256칼라를 기본으로 하지만
투루칼라까지 지원이
됩니다. 보통 640x480x256에서
가장 효율적인 기능을
제공한다고 메뉴얼에 나와 있더군요!
─────────────────────────────
HRESULT SetDisplayMode(LPDIRECTDRAW lpDD,
DWORD
dwWidth, DWORD dwHeight,
DWORD
dwBpp)
─────────────────────────────
역시 첫번째 인자는 DirectDraw를
뜻하는 것이겠죠~
dwWidth와 dwHeight는 가로 세로
해상도를 뜻하는 것이구요
마지막 dwBpp는 컬러수를 뜻합니다.
그럼 예제를 보죠~
ddrval=lpDD->SetDisplayMode(640, 480, 8);
위의 예제는 바로 640*480*256을 뜻합니다.
아주 쉽죠~ ^^;
자~ 여기까지 정리해 보죠~
첫번째 두번째 글을 읽어 보셔도
아직 이해가 되지 않죠~ 당연히
아직은 그리 중요하지는
않은 내용인듯합니다. (당연한
내용이므로...^^;)
//우선 사용될 다이렉트 변수들을
선언해야 겠죠~
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSPrimary;
LPDIRECTDRAWSURFACE lpDDSBack;
DDSCAPS ddscaps;
DDSURFACEDESC ddsd;
HRESULT hr;
//그다음에 다이렉트 드로우에
관한 생성자를 생성했죠~
hr = DirectDrawCreate(NULL,
&lpDD, NULL);
if(hr != DD_OK)
{
// 에러
관련 처리를 해야 겠죠?
// 보통
에러라고 표시를 하고 빠져 나갑니다.
}
// 자~ 그럼 이번에는 프로세서를 독점해야 겠죠~
hr = lpDD->SetCooperativeLevel(hWnd,
DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN
| DDSCL_ALLOWMODEX);
if(hr != DD_OK)
{
// 동일한
에러 처리를 하면 되겠죠~
}
// 여기서 해상도를 설정해야
겠죠!
hr = lpDD->SetDisplayMode(640,
480, 8);
if( hr != DD_OK)
{
// 당연
에러 처리겠죠~
}
// 여기까지....