熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

用DELPHI開發DirectX游戲

2013-11-23 17:45:08  來源: Delphi編程 
這不是一篇關於DirectX的詳細教程而是講解如何用DELPHI開發DirectX游戲因為不管是網上或是書店關於DirectX的書基本上是用C++或VC描述的用DELPHI開發游戲的資料是少之又少這篇文章的目的就是讓讀者能夠學會如何利用已有的資料學習來開發游戲

   這篇文章面向的是對DirectX有一定了解卻不知道如何在DELPHI下開發DirectX游戲的讀者 推薦參考資料:<<游戲編程指南>><<DirectX中文收冊>>

DELPHI能不能開發游戲?

  回答是當然網上很多游戲論壇有不少人都認為開發游戲只能用C++或VC DELPHI只適合來做做桌面應用勸有這些觀點的人先反匯編看看DELPHI和VC編釋出來的代碼或是看看奇跡時代這個游戲奇跡時代就是用DELPHI開發的速度和畫面優於帝國時代DELPHI是完全面向對象並能內嵌匯編支持MMX指令(DELPHI中MMX寄存器為mmmm)完全適合游戲開發的需要其實不論VCDELPHI都只是工具只要內功好都能做出來好的程序或是游戲

准備工作

  目前用DELPHI開發DirectX游戲有二種選擇一是使用jedi的DirectX聲明(http://wwwdelphijediorg)另一種是使用DelphiX控件在這裡我們准備使用jedi的DirectX聲明包來開發DirectX游戲之所以選擇DirectX聲明包是因為這樣是以SDK方式來開發游戲以後如果需要轉到其它語言也不必重新學習DirectX至於DelphiX控件我沒用過沒發言權不過偶是不用日貨的 ;)

  先到以下地址下載DirectX的聲明包(http://kuganet/download/files/directxrar)並解壓到你自定的目錄中再在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的話請把DirectDrawpas中的行{$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(hwndDDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK )
return FALSE; {設置DirectDraw控制級}

if ( lpDD>SetDisplayMode( DDSDM_STANDARDVGAMODE ) != DD_OK )
return FALSE; {置顯示模式}

}

DELPHI版:

function TFormInitDirectDraw: Boolean;
var
lpDD: IDirectDraw;
begin
Result := False; {先假設初始化失敗}
{建立DirectDraw對象}

if DirectDrawCreateEx(nil lpDD IID_IDIRECTDRAW nil) <> DD_OK then
exit;
{設定DirectDraw的控制級第一個參數為DirectDraw窗口的句柄這裡把控級級設為全屏加獨占模式}

if lpDDSetCooperativeLevel(Hwnd DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN) <> DD_OK then
exit;
{設定顯示模式第一二個參數為分辯率大小第三個參數用來設置顯示模式的顏色位數第四個參數設定屏幕的刷新率為默認值第四個參數唯一有效的值只有DDSDM_STANDARDVGAMODE}

if lpDDSetDisplayMode( 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
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.