Delphi作為一種方便的可視化程序設(shè)計(jì)語言,一 直非常受大家喜愛。但它在圖形處理、3D表現(xiàn)等方面 不很讓人滿意。如果說你要開發(fā)一個(gè)Windows95下的 3D游戲,你會(huì)用什么工具呢?DirectX!不少人會(huì)不加 思索地答道。然而接觸過DirectX的朋友們都知道它 內(nèi)部的結(jié)構(gòu)復(fù)雜,一般來說結(jié)合VC開發(fā)是一個(gè)理想 的組合。而要在Delphi中利用DirectX SDK真是難上 加難。但現(xiàn)在一切都好啦,有了本文介紹的DelphiX 組件,你終于可以用你熟悉的Delphi來開發(fā)漂亮的圖 形程序了。
DelphiX是由日本人Hiroyuki Hori開發(fā)的使Di rectX5.0在Delphi中更容易使用的一套控件,從網(wǎng)上 時(shí)叫DelphiX.zip,837KB。解開后在bin目錄下 運(yùn)行install_for?(根據(jù)你的Delphi版本號(hào),支持3.0和 4.0),DelphiX會(huì)自動(dòng)將控件安裝到你的Delphi中,幫 助文件也自動(dòng)融合到Delphi的幫助里,真是好用極 了!
DelphiX包括的控件有如下這些:
TDXDraw 最重要的控件,是DirectDraw和Direct3D的基礎(chǔ);
TDXDIB 一個(gè)代表DIB圖像的控件;
TDXImageList 代表一組 Tpicture;
TDX3D Direct3D控件,要與TDXDraw共同使用;
TDXSound DirectSound控件;
TDXWave 一個(gè)代表波形Wave的控件;
TDXWaveList 一組Wave;
TDXInput 輸入控制控件(操縱鍵盤和搖桿要靠它);
TDXPlay 通訊控件;
TDXSpriteEngine “精靈”引擎;
TDXTimer 高速時(shí)間控件;
TDXPaintbox TDXForm 專為DelphiX優(yōu)化過的Form?! ?
DirectDraw中重要的對(duì)象有:
TDirectDraw對(duì)象
DirectDraw應(yīng)用程序的核心,它是你創(chuàng)建的第一個(gè)對(duì)象。創(chuàng)建了DirectDraw對(duì) 象后,可以在它的基礎(chǔ)上創(chuàng)建其它所有相關(guān)的對(duì)象。 在DelphiX中的TDXdraw.ddraw屬性即是一個(gè)Tdi rectDraw對(duì)象。
TDirectDrawSurface對(duì)象
表征了一塊內(nèi)存區(qū) 域,在該區(qū)域的數(shù)據(jù)將作為圖像顯示在屏幕上或移動(dòng) 到其它表面上?!?
TDirectDrawPalette對(duì)象
表征了一個(gè)用于表面 的16色或256色的索引調(diào)色板,它包含了一系列描述 同表面相關(guān)的RGB顏色索引值?!?
TDirectDrawClipper對(duì)象
幫助你禁止向表面的 某一位置或超出表面的位置塊寫數(shù)據(jù)?! ?
Tsprite對(duì)象
代表了“精靈”,在許多視頻游戲都 使用了精靈。從最基本的意義上來講,一個(gè)精靈就是 在屏幕上移動(dòng)的圖像。精靈畫在一個(gè)表面上,覆蓋在 已有的背景上,合成后的圖像被送到屏幕上顯示出 來,在DelphiX中通過TspriteEngine實(shí)現(xiàn)對(duì)Tsprite的 控制?!?
TDirectDrawSurfaceCanvas對(duì)象
提供方便的 訪問機(jī)制,你可以像訪問一般Canvas對(duì)象一樣訪問 它。TDXDraw.Surface.Canvas即是這樣一個(gè)對(duì)象?! ?
TdirectDrawDisplay對(duì)象
控制著DirectDraw的 顯示模式,TdxDraw.display是這樣一個(gè)對(duì)象。
DelphiX基本上嚴(yán)格按照Microsoft DirectX SDK 開發(fā)包來將其功能在Delphi中實(shí)現(xiàn)出來。所以,如果 你對(duì)DirectX SDK比較熟悉的話,你會(huì)發(fā)現(xiàn)大多數(shù)程序從C移植到Delphi是很容易的事。DelphiX中沒有 提供幫助的地方,你可以在DirectX SDK中獲得答案?! ?
下面通過一個(gè)簡單的例子對(duì)如何利用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;{在繪制之前檢驗(yàn)是否允許}
DXDraw1.Surfaca.Fill(0);
x: = x + 1;
y: = y + 1;
DXDraw1.Surface.Draw(X, Y, Fsurface.ClientRect,Fsur face, True);
DXDraw1.Flip; {將內(nèi)存中的表面再將映射入實(shí)際顯存}
end;
procedure TForm1.FormActivate(Sender:Tobject);
begin
X: =0;
y: =0;
end;
end.
首先要在程序開頭包含DXClass、DXDraws兩個(gè) Unit(TDXtimer、TDXForm在DXClass中定義,TDX Draw在DXDraws中定義)。程序用的Form不要從一 般的Tform派生,而應(yīng)從TDXForm中派生。在Form 中放入TDXDraw控件和TDXTimer控件,將其inter val值設(shè)為0。對(duì)DXDraw1控件改變其屬性,使其與 Form大小一致。再放人一個(gè)TDXDIB控件,在其屬性 中的DIB一項(xiàng)調(diào)人一個(gè)位圖,如Windows下的bub bles.bmp。定義一個(gè)DirectDraw表面Fsurface,這是一 個(gè)抽象內(nèi)存表面,以后會(huì)將它映射到DXDraw對(duì)象的 Surface上。在DXDraw的Events一欄中編寫OnIni tialize、OnFinalize、OnRestoreSurface三個(gè)過程,之后便 可以根據(jù)需要對(duì)表面進(jìn)行操縱。
另外,要完成上面程序的功能,還有其他不少辦 法。例如利用TDXImageList對(duì)象,可以用它的方法 Imagelist.items[N].draw來完成同樣功能。
總之,DirectX博大精深,希望本文能為大家掀開 冰山的一角。