Delphi作為一種方便的可視化程序設計語言,一 直非常受大家喜愛。但它在圖形處理、3D表現(xiàn)等方面 不很讓人滿意。如果說你要開發(fā)一個Windows95下的 3D游戲,你會用什么工具呢?DirectX!不少人會不加 思索地答道。然而接觸過DirectX的朋友們都知道它 內部的結構復雜,一般來說結合VC開發(fā)是一個理想 的組合。而要在Delphi中利用DirectX SDK真是難上 加難。但現(xiàn)在一切都好啦,有了本文介紹的DelphiX 組件,你終于可以用你熟悉的Delphi來開發(fā)漂亮的圖 形程序了。
DelphiX是由日本人Hiroyuki Hori開發(fā)的使Di rectX5.0在Delphi中更容易使用的一套控件,從網(wǎng)上 時叫DelphiX.zip,837KB。解開后在bin目錄下 運行install_for?(根據(jù)你的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優(yōu)化過的Form?! ?
DirectDraw中重要的對象有:
TDirectDraw對象
DirectDraw應用程序的核心,它是你創(chuàng)建的第一個對象。創(chuàng)建了DirectDraw對 象后,可以在它的基礎上創(chuàng)建其它所有相關的對象。 在DelphiX中的TDXdraw.ddraw屬性即是一個Tdi rectDraw對象。
TDirectDrawSurface對象
表征了一塊內存區(qū) 域,在該區(qū)域的數(shù)據(jù)將作為圖像顯示在屏幕上或移動 到其它表面上?!?
TDirectDrawPalette對象
表征了一個用于表面 的16色或256色的索引調色板,它包含了一系列描述 同表面相關的RGB顏色索引值?!?
TDirectDrawClipper對象
幫助你禁止向表面的 某一位置或超出表面的位置塊寫數(shù)據(jù)?! ?
Tsprite對象
代表了“精靈”,在許多視頻游戲都 使用了精靈。從最基本的意義上來講,一個精靈就是 在屏幕上移動的圖像。精靈畫在一個表面上,覆蓋在 已有的背景上,合成后的圖像被送到屏幕上顯示出 來,在DelphiX中通過TspriteEngine實現(xiàn)對Tsprite的 控制?!?
TDirectDrawSurfaceCanvas對象
提供方便的 訪問機制,你可以像訪問一般Canvas對象一樣訪問 它。TDXDraw.Surface.Canvas即是這樣一個對象?! ?
TdirectDrawDisplay對象
控制著DirectDraw的 顯示模式,TdxDraw.display是這樣一個對象。
DelphiX基本上嚴格按照Microsoft DirectX SDK 開發(fā)包來將其功能在Delphi中實現(xiàn)出來。所以,如果 你對DirectX SDK比較熟悉的話,你會發(fā)現(xiàn)大多數(shù)程序從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);
{創(chuàng)建抽象圖像表面}
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三個過程,之后便 可以根據(jù)需要對表面進行操縱。
另外,要完成上面程序的功能,還有其他不少辦 法。例如利用TDXImageList對象,可以用它的方法 Imagelist.items[N].draw來完成同樣功能。
總之,DirectX博大精深,希望本文能為大家掀開 冰山的一角。