이것은 DirectX에 대한 자세한 튜토리얼이 아니라 DELPHI를 사용하여 DirectX 게임을 개발하는 방법에 대한 설명입니다. 온라인이나 서점에서 DirectX에 관한 책은 기본적으로 C++ 또는 VC로 설명하기 때문입니다. 이 기사의 목적은 독자들이 기존 정보를 사용하여 게임을 배우고 개발하는 방법을 배울 수 있도록 하는 것입니다.
이 기사는 DirectX에 대해 어느 정도 이해하고 있지만 DELPHI에서 DirectX 게임을 개발하는 방법을 모르는 독자를 위한 것입니다.
권장 참고 자료:
<<게임 프로그래밍 가이드>>,<<DirectX 중국어 컬렉션>>
DELPHI가 게임을 개발할 수 있나요?
대답은 물론입니다. 많은 온라인 게임 포럼의 많은 사람들은 C++ 또는 VC만이 게임 개발에 사용될 수 있다고 믿습니다. DELPHI는 데스크톱 애플리케이션에만 적합합니다. 이러한 관점을 가진 사람들은 DELPHI와 VC에서 컴파일한 코드를 분해하여 살펴보거나 DELPHI로 개발된 "Age of Miracles" 게임을 살펴보는 것이 좋습니다. 그래픽은 Age of Empires.DELP보다 낫습니다. HI는 완전히 객체 지향적이고 어셈블리를 내장할 수 있으며 MMX 명령어를 지원합니다(DELPHI의 MMX 레지스터는 mm0-mm7입니다). 실제로 VC에 관계없이 DELPHI는 단지 도구일 뿐입니다. 내부 기술만 좋으면 좋은 프로그램이나 게임으로 만들 수 있습니다.
준비:
현재 DELPHI로 DirectX 게임을 개발하는 데는 두 가지 옵션이 있습니다. 하나는 jedi의 DirectX 선언(http://www.delphi-jedi.org)을 사용하는 것입니다. 다른 하나는 DelphiX 컨트롤을 사용하는 것입니다. X 선언 패키지는 DirectX 게임 개발에 사용됩니다. 제가 DirectX 선언 패키지를 선택한 이유는 SDK 방식을 사용하여 게임을 개발할 경우 향후에 다른 언어로 전환할 필요가 없기 때문입니다. DirectX를 다시 배우세요. DelphiX 컨트롤은 사용해본 적도 없고 일본 제품도 사용하지 않습니다.
먼저 다음 주소로 이동하여 DirectX 선언 패키지(http://kuga.51.net/download/files/directx7.rar)를 다운로드하고 사용자 정의 디렉터리에 압축을 푼 다음 DELPHI에서 도구->환경 옵션을 선택합니다. 열린 창에서 라이브러리 탭을 선택하고 라이브러리 경로 뒤에 있는 버튼을 클릭합니다. 디렉토리 창이 나타나면 유효하지 않은 것으로 표시된 회색 항목을 클릭합니다. 경로 오른쪽에 있는 버튼을 클릭하여 DirectX 선언이 추출된 디렉토리를 선택하고, ADD 버튼을 클릭하면 DirectX 선언이 있는 디렉토리를 DELPHI의 라이브러리 경로에 추가할 수 있습니다. 이 선언 패키지에는 시작을 위한 참조로 사용할 수 있는 여러 예제가 함께 제공됩니다.
디버깅 경험:
전체 화면 게임을 개발할 때, 디버깅 중에 해상도를 자주 전환하여 화면이 손상되는 것을 방지하려면 디자인 중에 화면 해상도를 게임과 동일한 해상도로 설정하는 것이 가장 좋습니다.
WIN2000/XP에서 전체 화면 게임을 개발하는 것이 가장 좋습니다. 그렇지 않으면 98 미만에서 디버깅할 때 게임이 무한 루프에 빠지거나 전체 화면 게임이 무한 루프에 들어가면 쉽게 충돌이 발생합니다. 2000/XP 미만에서는 ALT+TAB 스위치를 눌러 DELPHI로 전환할 수 있습니다(그러나 현재로서는 DirectX 게임은 전체화면으로 화면을 점유하기 때문에 화면에 변화가 없으므로 몇번 더 시도해야 합니다.) 비정상적인 경우에는 DELPHI로 전환하여 게임을 종료하세요. 먼저 Enter를 누른 다음 CTRL+F2를 누르면 디버깅 게임이 종료됩니다.
알아채다:
DELPHI7을 사용하는 경우 일반적인 컴파일 및 해석을 위해 DirectDraw.pas의 145행 {$IFDEF VER140}을 {$IFDEF VER150}으로 변경하세요.
VCL의 TFORM 클래스를 사용하는 대신 API를 사용하여 기본 게임 창을 만드는 것이 더 좋습니다.
먼저 C++ 및 DELPHI를 사용하여 DirectDraw 개체를 초기화하는 코드 조각을 살펴보겠습니다.
C++ 버전:
BOOL InitDDraw( )
{
LPDIRECTDRAW7 lpDD; //DirectDraw 개체에 대한 포인터
if (DirectDrawCreateEx (NULL, (void **)&lpDD, IID_IDirectDraw7, NULL) != DD_OK )
FALSE를 반환합니다. {DirectDraw 개체 만들기}
{오류 검출을 위해 if (xxx != DD_OK) 방식을 사용하며, 가장 일반적으로 사용되는 방식입니다.}
if (lpDD->SetCoOperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK )
FALSE를 반환합니다. {DirectDraw 제어 수준 설정}
if ( lpDD->SetDisplayMode( 640, 480, 32, 0, DDSDM_STANDARDVGAMODE ) != DD_OK )
FALSE를 반환합니다. {디스플레이 모드 설정}
}
델파이 버전:
함수 TForm1.InitDirectDraw: 부울;
var
lpDD: IDirectDraw7;
시작하다
결과 := False {초기화 실패 가정}
{DirectDraw 객체 생성}
if DirectDrawCreateEx(nil, lpDD, IID_IDIRECTDRAW7, nil) <> DD_OK then
출구;
{DirectDraw의 제어 수준을 설정합니다. 첫 번째 매개변수는 DirectDraw 창의 핸들입니다. 여기서 제어 수준은 전체 화면 + 독점 모드로 설정됩니다.}
lpDD.SetCooperativeLevel(Hwnd, DDSCL_EXCLUSIVE 또는 DDSCL_FULLSCREEN) <> DD_OK인 경우
출구;
{디스플레이 모드를 설정합니다. 첫 번째와 두 번째 매개변수는 해상도입니다. 세 번째 매개변수는 디스플레이 모드의 색상 자릿수를 설정하는 데 사용됩니다.
네 번째 매개변수는 화면 새로 고침 빈도를 설정합니다. 기본값은 4번째 매개변수의 유일한 유효한 값입니다.
lpDD.SetDisplayMode(640, 480, 32, 0, DDSDM_STANDARDVGAMODE) <> DD_OK이면
출구;
결과 := 참;
끝;
이 두 코드는 구문과 개체 이름을 제외하면 완전히 동일하다는 것을 알 수 있습니다. 이를 이해하는 한 VC 또는 C++ 정보를 참조한 다음 DELPHI를 사용하여 자체 게임을 만들 수 있습니다. DELPHI의 DirectX 선언 이름, 구조 이름 및 VC는 다음과 같습니다.
델파이 VC
DirectDraw 개체IDirectDraw7 LPDIRECTDRAW7
페이지 개체 IDirectDrawSurface7 LPDIRECTDRAWSURFACE7
DirectDraw 페이지 설명 TDDSurfaceDesc2 DDSURFACEDESC2
기본적으로 접두사만 다릅니다. 공간으로 인해 여기에 모든 개체와 구조가 나열되지는 않습니다.