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

在Delphi中使用DirectX

編輯:Delphi

  Delphi作為一種方便的可視化程序設計語言,一 直非常受大家喜愛。但它在圖形處理、3D表現等方面 不很讓人滿意。如果說你要開發一個Windows95下的 3D游戲,你會用什麼工具呢?DirectX!不少人會不加 思索地答道。然而接觸過DirectX的朋友們都知道它 內部的結構復雜,一般來說結合VC開發是一個理想 的組合。而要在Delphi中利用DirectX SDK真是難上 加難。但現在一切都好啦,有了本文介紹的DelphiX 組件,你終於可以用你熟悉的Delphi來開發漂亮的圖 形程序了。

  DelphiX是由日本人Hiroyuki Hori開發的使Di rectX5.0在Delphi中更容易使用的一套控件,從網上 下載時叫DelphiX.zip,837KB。解開後在bin目錄下 運行install_for?(根據你的Delphi版本號,支持3.0和 4.0),DelphiX會自動將控件安裝到你的Delphi中,幫 助文件也自動融合到Delphi的幫助裡,真是好用極 了!

  DelphiX包括的控件有如下這些:

  TDXDraw 最重要的控件,是DirectDraw和Direct3D的基礎;

  TDXDIB 一個代表DIB圖像的控件;

  TDXImageList 代表一組 Tpicture;

  TDX3D Direct3D控件,要與TDXDraw共同使用;

  TDXSound DirectSound控件;

  TDXWave 一個代表波形Wave的控件;

  TDXWaveList 一組Wave;

  TDXInput 輸入控制控件(操縱鍵盤和搖桿要靠它);

  TDXPlay 通訊控件;

  TDXSpriteEngine “精靈”引擎;

  TDXTimer 高速時間控件;

  TDXPaintbox TDXForm 專為DelphiX優化過的Form。  

  DirectDraw中重要的對象有:  

  TDirectDraw對象

  DirectDraw應用程序的核心,它是你創建的第一個對象。創建了DirectDraw對 象後,可以在它的基礎上創建其它所有相關的對象。 在DelphiX中的TDXdraw.ddraw屬性即是一個Tdi rectDraw對象。

  TDirectDrawSurface對象

  表征了一塊內存區 域,在該區域的數據將作為圖像顯示在屏幕上或移動 到其它表面上。 

  TDirectDrawPalette對象

  表征了一個用於表面 的16色或256色的索引調色板,它包含了一系列描述 同表面相關的RGB顏色索引值。 

  TDirectDrawClipper對象

  幫助你禁止向表面的 某一位置或超出表面的位置塊寫數據。  

  Tsprite對象

  代表了“精靈”,在許多視頻游戲都 使用了精靈。從最基本的意義上來講,一個精靈就是 在屏幕上移動的圖像。精靈畫在一個表面上,覆蓋在 已有的背景上,合成後的圖像被送到屏幕上顯示出 來,在DelphiX中通過TspriteEngine實現對Tsprite的 控制。 

  TDirectDrawSurfaceCanvas對象

  提供方便的 訪問機制,你可以像訪問一般Canvas對象一樣訪問 它。TDXDraw.Surface.Canvas即是這樣一個對象。  

  TdirectDrawDisplay對象

  控制著DirectDraw的 顯示模式,TdxDraw.display是這樣一個對象。

  DelphiX基本上嚴格按照Microsoft DirectX SDK 開發包來將其功能在Delphi中實現出來。所以,如果 你對DirectX SDK比較熟悉的話,你會發現大多數程序從C移植到Delphi是很容易的事。DelphiX中沒有 提供幫助的地方,你可以在DirectX SDK中獲得答案。 

  下面通過一個簡單的例子對如何利用DelphiX編 程作一介紹,只涉及Ddraw二維的一小部分。

  unit Unit1;

  interface

  uses

   Windows.Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

   DXClass, DXDraws, DIB;

  type

   TForm1=class(TDXForm)

   DXDraw1:TDXDraw;

   DXTimer1:TDXTimer;

   DXDIB1:TDXDIB;

   procedure DXDrawlFinalize(Sender:Tobject);

   procedure DXDraw1Initialize(Sender:Tobject);

   procedure DXDraw1RestoreSurfase(Sender:Tobject);

   procedure DXTimer1Timer(Sendsr:Tobject;LagCount:Integer);

   procedure ForMactivate(Sender:Tobject);

  private

   {Private declarations}

  public

   {Public declarations}

  private

   Fsurface:TDirectDrawSurface;

   end;

  var

   Form1:TForm1;

   x,y:integer;

  implementation

  {$R *.DFM}

  procedure TForm1.DXDrawlInitialize(Sender:Tobject);

  begin

   Fsurface:=TDirectDrawSurface.Create(DXDraw1.Ddraw);

   {創建抽象圖像表面}

  end;

  procedure TForm1.DXDraw1Finalize(Sender:Tobject);

  begin

   Fsurface.Free; Fsurface: = nil;

   {釋放表面}

  end;

  procedure TForm1.DXDraw1RestoreSurfare(Sender:Tobject);

  begin

   Fsurface.LoadfromGraphic(DXDIB1.DIB);{將位圖送入抽象表面}

  end;

  procedure TForm1.DXTimer1Timer(Sendsr.Tobject;LagCount integer);

  begin

   if not DXDraw1.CanDraw then Exit;{在繪制之前檢驗是否允許}

   DXDraw1.Surfaca.Fill(0);

   x: = x + 1;

   y: = y + 1;

   DXDraw1.Surface.Draw(X, Y, Fsurface.ClIEntRect,Fsur face, True);

   DXDraw1.Flip; {將內存中的表面再將映射入實際顯存}

  end;

  procedure TForm1.ForMactivate(Sender:Tobject);

  begin

   X: =0;

   y: =0;

  end;

  end.

   首先要在程序開頭包含DXClass、DXDraws兩個 Unit(TDXtimer、TDXForm在DXClass中定義,TDX Draw在DXDraws中定義)。程序用的Form不要從一 般的Tform派生,而應從TDXForm中派生。在Form 中放入TDXDraw控件和TDXTimer控件,將其inter val值設為0。對DXDraw1控件改變其屬性,使其與 Form大小一致。再放人一個TDXDIB控件,在其屬性 中的DIB一項調人一個位圖,如Windows下的bub bles.bmp。定義一個DirectDraw表面Fsurface,這是一 個抽象內存表面,以後會將它映射到DXDraw對象的 Surface上。在DXDraw的Events一欄中編寫OnIni tialize、OnFinalize、OnRestoreSurface三個過程,之後便 可以根據需要對表面進行操縱。

   另外,要完成上面程序的功能,還有其他不少辦 法。例如利用TDXImageList對象,可以用它的方法 Imagelist.items[N].draw來完成同樣功能。

   總之,DirectX博大精深,希望本文能為大家掀開 冰山的一角。

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