線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2405
推到 Plurk!
推到 Facebook!

在Delphi中使用DirectX

 
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-29 13:20:28 IP:61.221.xxx.xxx 未訂閱
在Delphi中使用DirectX http://hub.myrice.com/delphizt/dmtl/012.htm
 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來完成同樣功    
發表人 - ab 於 2003/11/29 13:39:57
系統時間:2017-10-23 21:23:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!