這不是一篇關於DirectX的詳細教程
而是講解如何用DELPHI開發DirectX游戲
因為不管是網上或是書店
關於DirectX的書基本上是用C++或VC描述的
用DELPHI開發游戲的資料是少之又少
這篇文章的目的就是讓讀者能夠學會如何利用已有的資料學習來開發游戲
這篇文章面向的是對DirectX有一定了解
卻不知道如何在DELPHI下開發DirectX游戲的讀者
推薦參考資料:<<游戲編程指南>>
<<DirectX中文收冊>>
一DELPHI能不能開發游戲? 回答是當然
網上很多游戲論壇有不少人都認為開發游戲只能用C++或VC
DELPHI只適合來做做桌面應用
勸有這些觀點的人先反匯編看看DELPHI和VC編釋出來的代碼
或是看看
奇跡時代
這個游戲
奇跡時代
就是用DELPHI開發的
速度和畫面優於帝國時代
DELPHI是完全面向對象
並能內嵌匯編
支持MMX指令(DELPHI中MMX寄存器為mm
mm
)
完全適合游戲開發的需要
其實不論VC
DELPHI都只是工具
只要內功好都能做出來好的程序或是游戲
二准備工作 目前用DELPHI開發DirectX游戲有二種選擇
一是使用jedi的DirectX聲明(http://www
delphi
jedi
org)
另一種是使用DelphiX控件
在這裡我們准備使用jedi的DirectX聲明包來開發DirectX游戲
之所以選擇DirectX聲明包
是因為這樣是以SDK方式來開發游戲
以後如果需要轉到其它語言也不必重新學習DirectX
至於DelphiX控件我沒用過
沒發言權
不過偶是不用日貨的 ;
)
先到以下地址下載DirectX的聲明包(http://kuga
net/download/files/directx
rar)
並解壓到你自定的目錄中
再在DELPHI中選擇Tools
>Environment Options
在打開的窗口中選擇Library選項卡
點擊Library Path後面的按鈕
會彈出來一個Directories窗口
再點擊Greyed items denote invalid path右邊的按鈕
選擇DirectX聲明解壓到的目錄
再點擊ADD按鈕
這樣就把DirectX聲明所在的目錄添加到了DELPHI 的Library路徑中
就可以直接在uses中引用DirectX聲明中的單元了
這個聲明包裡自帶了幾個例子
可以作為入門的參考
三調試經驗 開發全屏游戲時最好把設計時的屏幕分辯率設為和游戲一樣的分辯率
以免調試時頻繁切換分辯率而損傷屏幕
開發全屏游戲最好是在WIN
/XP下
不然在
下調試時游戲進入死循環或產生異常時
機子很容易就會當掉
在
/XP下全屏游戲進入死循環時可以按ALT+TAB切換到DELPHI中(但這時由於DirectX游戲是全屏
獨占了屏幕
屏幕上不會有變化
所以要多試幾次)
按CTRL+F
就可以結束游戲
如果是異常的話
切換到DELPHI中先按下回車再按CTRL+F
就可以結束調試游戲了
注意:
如果你是使用DELPHI
的話
請把DirectDraw
pas中的
行{$IFDEF VER
}改為{$IFDEF VER
}才能正常編釋
最好使用API的方式來建立游戲主窗口而不是使用VCL的TFORM類
先讓我們來看看用C++和DELPHI初始化DirectDraw對像的代碼段
c++版:
BOOL InitDDraw( )
{
LPDIRECTDRAW
lpDD; // DirectDraw對象的指針
if ( DirectDrawCreateEx (NULL
(void **)&lpDD
IID_IDirectDraw
NULL) != DD_OK )
return FALSE; {創建DirectDraw對象}
{這裡使用了 if ( xxx != DD_OK) 的方法進行錯誤檢測
這是最常用的方法}
if (lpDD
>SetCooperativeLevel(hwnd
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK )
return FALSE; {設置DirectDraw控制級}
if ( lpDD
>SetDisplayMode(
DDSDM_STANDARDVGAMODE ) != DD_OK )
return FALSE; {置顯示模式}
}
DELPHI版:
function TForm
InitDirectDraw: Boolean;
var
lpDD: IDirectDraw
;
begin
Result := False; {先假設初始化失敗}
{建立DirectDraw對象}
if DirectDrawCreateEx(nil
lpDD
IID_IDIRECTDRAW
nil) <> DD_OK then
exit;
{設定DirectDraw的控制級
第一個參數為DirectDraw窗口的句柄
這裡把控級級設為全屏加獨占模式}
if lpDD
SetCooperativeLevel(Hwnd
DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN) <> DD_OK then
exit;
{設定顯示模式
第一
二個參數為分辯率大小
第三個參數用來設置顯示模式的顏色位數
第四個參數設定屏幕的刷新率
為默認值
第四個參數唯一有效的值只有DDSDM_STANDARDVGAMODE}
if lpDD
SetDisplayMode(
DDSDM_STANDARDVGAMODE) <> DD_OK then
exit;
Result := True;
end;
可以看出來
這二段代碼除了語法和對象名外完全一樣
只要了解了這點
我們完全可以參考VC或C++的資料
然後用DELPHI做出自己的游戲了
DELPHI中DirectX聲明中的對象名
結構名和VC不一樣
一般的對應關系如下:
DELPHI VC
DirectDraw對象 IDirectDraw
LPDIRECTDRAW
頁面對象 IDirectDrawSurface
LPDIRECTDRAWSURFACE
DirectDraw的頁面描述 TDDSurfaceDesc
DDSURFACEDESC
基本上只是前綴不一樣
由於篇幅
這兒就不一一列出所有對像和結構了
From:http://tw.wingwit.com/Article/program/Delphi/201311/25022.html