これは、DirectX に関する詳細なチュートリアルではなく、DirectX ゲームを開発するための DELPHI の使用方法の説明です。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 ゲームを開発するには 2 つのオプションがあります。1 つは jedi の DirectX 宣言 (http://www.delphi-jedi.org) を使用する方法です。ここでは jedi の DirectX コントロールを使用します。 X 宣言パッケージは DirectX ゲームの開発に使用されます。私が DirectX 宣言パッケージを選択した理由は、将来他の言語に切り替える必要がある場合に、SDK メソッドを使用するためです。 DirectX を再学習してください。DelphiX コントロールについては、私は使用したことがないので何も言えませんが、日本の製品は使用していません。
まず、次のアドレスにアクセスして DirectX 宣言パッケージ (http://kuga.51.net/download/files/directx7.rar) をダウンロードし、それをカスタム ディレクトリに抽出します。次に、DELPHI で [ツール] -> [環境オプション] を選択します。開いたウィンドウで [ライブラリ] タブを選択し、[ライブラリ パス] の後ろにあるボタンをクリックすると、[ディレクトリ] ウィンドウが表示され、無効であることを示す灰色の項目をクリックします。パスの右側にある ボタンをクリックして、DirectX 宣言を抽出するディレクトリを選択し、[追加] ボタンをクリックして、DirectX 宣言が存在するディレクトリを DELPHI のライブラリ パスに追加します。この宣言は、パッケージには開始時の参考として使用できるいくつかの例が付属しています。
デバッグ経験:
フルスクリーン ゲームを開発する場合、デバッグ中に解像度を頻繁に切り替えることによる画面の損傷を避けるために、設計時の画面解像度をゲームと同じ解像度に設定することが最善です。
WIN2000/XP でフルスクリーン ゲームを開発するのが最善です。そうしないと、98 でデバッグすると、ゲームが無限ループに陥ったり、マシンが簡単にクラッシュしたりします。 2000/XP では、ALT+TAB を押すと DELPHI に切り替えることができます (ただし、現時点ではDirectX ゲームはフルスクリーンで画面を占有するため、画面に変化はありません。何度か試す必要があります。異常な場合は、CTRL+F2 を押してゲームを終了してください。最初に 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: ブール値;
変数
lpDD: IDirectDraw7;
始める
結果 := False; {初期化が失敗したと仮定します}
{DirectDraw オブジェクトの作成}
if DirectDrawCreateEx(nil, lpDD, IID_IDIRECTDRAW7, nil) <> DD_OK then
出口;
{DirectDraw のコントロール レベルを設定します。最初のパラメータは DirectDraw ウィンドウのハンドルです。ここでは、コントロール レベルはフル スクリーン プラス排他モードに設定されています。
if lpDD.SetCooperativeLevel(Hwnd, DDSCL_EXCLUSIVE または DDSCL_FULLSCREEN) <> DD_OK then
出口;
{表示モードを設定します。最初と 2 番目のパラメータは解像度です。3 番目のパラメータは、表示モードの色の桁数を設定するために使用されます。
4 番目のパラメータは、画面のリフレッシュ レートを設定します。デフォルト値は 0 です。4 番目のパラメータの唯一の有効な値は DDSDM_STANDARDVGAMODE} です。
if lpDD.SetDisplayMode(640, 480, 32, 0, DDSDM_STANDARDVGAMODE) <> DD_OK then
出口;
結果 := True;
終わり;
これら 2 つのコードは、構文とオブジェクト名を除いてまったく同じであることがわかります。これを理解していれば、VC または C++ の情報を参照して、DELPHI を使用して独自のゲームを作成できます。 DELPHI での DirectX 宣言 名前、構造体名、VC は異なります。一般的な対応は次のとおりです。
デルフィVC
DirectDraw オブジェクトIDirectDraw7 LPDIRECTDRAW7
ページ オブジェクト IDirectDrawSurface7 LPDIRECTDRAWSURFACE7
DirectDraw ページの説明 TDDSurfaceDesc2 DDSURFACEDESC2
基本的に、接頭辞のみが異なります。スペースの都合上、すべてのオブジェクトと構造がここにリストされているわけではありません。