程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用DELPHI開發DirectX游戲

用DELPHI開發DirectX游戲

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

  推薦參考資料:
  <<游戲編程指南>>,<<DirectX中文收冊>>

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

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

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

  注意:
    如果你是使用Delphi7的話,請把DirectDraw.pas中的145行{$IFDEF VER140}改為{$IFDEF VER150}才能正常編釋.
    最好使用API的方式來建立游戲主窗口而不是使用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->SetCoOperativeLevel(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
  基本上只是前綴不一樣,由於篇幅,這兒就不一一列出所有對像和結構了.


  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved