用DELPHI開發DirectX遊戲 (轉)

worldblog發表於2007-08-17
用DELPHI開發DirectX遊戲 (轉)[@more@]

  這不是一篇關於的祥細教程,而是講解如何用開發DirectX遊戲.因為不管是網上或是書店,關於DirectX的書基本上是用C++或VC描述的.用DELPHI開發遊戲的資料是少之又少,這篇文章的目的就是讓讀者能夠學會如何利用已有的資料學習來開發遊戲.
  這篇文章面向的是對DirectX有一定了解,卻不知道如何在DELPHI下開發DirectX遊戲的讀者.

推薦參考資料:
<>,<>

DELPHI能不能開發遊戲?
  回答是當然,網上很多遊戲論壇有不少人都認為開發遊戲只能用C++或VC. DELPHI只適合來做做桌面應用,勸有這些觀點的人先反看看DELPHI和VC編釋出來的程式碼,或是看看"奇蹟時代"這個遊戲,"奇蹟時代"就是用DELPHI開發的,速度和畫面優於帝國時代.DELPHI是完全面向,並能內嵌彙編,支援MMX指今(DELPHI中MMX暫存器為mm0-mm7).完全適合遊戲開發的需要.其實不論VC,DELPHI都只是工具,只要內功好都能做出來好的或是遊戲.

準備工作:
  目前用DELPHI開發DirectX遊戲有二種選擇.一是使用jedi的DirectX宣告().另一種是使用DelphiX.在這裡我們準備使用jedi的DirectX宣告包來開發DirectX遊戲,之所以選擇DirectX宣告包是因為這樣是以SDK方式來開發遊戲,以後如果需要轉到其它語言也不必重新學習DirectX.至於DelphiX控制元件我沒用過,沒發言權,不過偶是不用日貨的 ;-)
  先到以下地址DirectX的宣告包(//files/directx7.rar">),並解壓到你自定的目錄中.再在DELPHI中選擇Tools->Environment Options,在開啟的視窗中選擇Library選項卡,點選Library Path後面的按鈕.會彈出來一個Directories視窗,再點選Greyed items denote invalid path右邊的按鈕.選擇DirectX宣告解壓到的目錄.再點選ADD按鈕,這樣就把DirectX宣告所在的目錄新增到了DELPHI 的Library路徑中.就可以直接在uses中引用DirectX宣告中的單元了.這個宣告包裡自帶了幾個例子,可以作為的參考.

:
  開發全屏遊戲時最好把設計時的螢幕分辯率設為和遊戲一樣的分辯率,以免除錯時頻繁切換分辯率而損傷螢幕.
  開發全屏遊戲最好是在/XP下,不然在98下除錯時遊戲進入死迴圈或產生異常時.機子很容易就會當掉.在2000/XP下全屏遊戲進入死迴圈時可以按ALT+TAB切換到DELPHI中(但這時由於DirectX遊戲是全屏,獨佔了螢幕,螢幕上不會有變化,所以要多試幾次),按CTRL+F2就可以結束遊戲.如果是異常的話,切換到DELPHI中先按下回車再按CTRL+F2就可以結束除錯遊戲了.

注意:
  如果你是使用DELPHI7的話,請把DirectDraw.pas中的145行{$IFDEF VER140}改為{$IFDEF VER150}才能正常編釋.
  最好使用的方式來建立遊戲主視窗而不是使用VCL的TFORM類.

先讓我們來看看用C++和DELPHI初始化DirectDraw對像的程式碼段.
c++版:
BOOL InitDDraw( )
{
  LPDIRECTDRAW7 lpDD; // DirectDraw物件的指標
  if ( DirectDrawCreateEx (NULL, (void **)&lpDD, IID_IDirectDraw7, NULL) != DD_OK )
  return FALSE;   {建立DirectDraw物件}
  {裡使用了 if ( xxx != DD_OK) 的方法進行錯誤檢測,這是最常用的方法}
  if (lpDD->SetCerativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK )
  return FALSE;  {設定DirectDraw控制級}
  if ( lpDD->SetDisplayMode( 640, 480, 32, 0, DDSDM_STANDARDVGAMODE ) != DD_OK )
  return FALSE;  {置顯示}
}

DELPHI版:
function TForm1.InitDirectDraw: Boolean;
var
  lpDD: IDirectDraw7;
begin
  Result := False; {先假設初始化失敗}
  {建立DirectDraw物件}
  if DirectDrawCreateEx(nil, lpDD, IID_IDIRECTDRAW7, nil) <> DD_OK then
  exit;
  {設定DirectDraw的控制級,第一個引數為DirectDraw視窗的控制程式碼,這裡把控級級設為的全屏加獨佔模式}
  if lpDD.SetCooperativeLevel(Hwnd, DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN) <> DD_OK then
  exit;
  {設定顯示模式,第一,二個引數為分辯率大小,第三個引數用來設定顯示模式的顏色位數,
  第四個引數設定螢幕的重新整理率,0為預設值,第四個引數唯一有效的值只有DDSDM_STANDARDVGAMODE}
  if lpDD.SetDisplayMode(640, 480, 32, 0, DDSDM_STANDARDVGAMODE) <> DD_OK then
  exit;
  Result := True;
end;

可以看出來,這二段程式碼除了語法和物件名外完全一樣,只要瞭解了這點,我們完全可以參考VC或C++的資料,然後用DELPHI做出自己的遊戲了.DELPHI中DirectX宣告中的物件名,結構名和VC不一樣,一般的對應關係如下:
  DELPHI  VC
DirectDraw物件  IDirectDraw7  LPDIRECTDRAW7
頁面物件  IDirectDrawSurface7  LPDIRECTDRAWSURFACE7
DirectDraw的頁面描述 TDDSurfaceDesc2  DDSURFACEDESC2
基本上只是字首不一樣,由於篇幅,這兒就不一一列出所有對像和結構了.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-963791/,如需轉載,請註明出處,否則將追究法律責任。

相關文章