㊣ 大家一起来 ——>> DirectX之DelphiX入门.1 (100分)

  • 主题发起人 YB_unique
  • 开始时间
Y

YB_unique

Unregistered / Unconfirmed
GUEST, unregistred user!
说来好笑,一旦要谈心得了,又好像一时千言万语不知从何说起,想来想去还是照Mr曹的意见吧!先对比一下DirectX
和DelphiX的异同。有人说DirectX更核心,此言不错,不过不要忘了DelphiX作为封装好的控件有其易用性和方便性,大家
可以以此更好更快的练手入门啊!曾在韩国、德国、俄罗斯的网站都见过关于DelphiX的使用介绍,所以说技术无国界!
(盲目自大锁国是没有意义的,我们应该理智的看待这个世界,强国应该有鲁迅先生提倡的“拿来主义”精神,取长补短,
所谓“师夷长技以制夷”正是此意,此为治国上上之策,呵呵!打住,有些扯远了。Let's Go !)
大家通过前面的热身都知道了标准的DirectX应该由以下几个部分组成:
DirectDraw、DirectInput、DirectPlay、DirectSound、DirectSound3D、DirectMusic、Direct3D。作用在前文都有所介绍。
接下来我们熟悉一下DelphiX控件,大家可以对照安装好的面板来看。
DelphiX作为一套Delphi下开发DirectX程序的控件,它又提供了哪些给我们调用呢?这是大家最关心的话题,以下就是
它所提供的所有单元(8个):
DIB、DXClass、DXDraws、DXInput、DXPlay、DXSounds、DXSprite、Wave。
以下为它们的功能之简要说明:
DIB包括TDXDIB和TDXPaintBox两个部分,TDXDIB是提供DIB图象控制,TDXPaintBox是专门优化后的Paintbox。像调色板、象
素、颜色等等就都由它解决。
DXClass包括了TDXForm和TDXTimer两个部分,TDXForm专为DelphiX优化过的Form,TDXTimer则是一套高速时间控件。它常常
被用来作为时间处理、判断开始结束、处理Form上的点位置等等。
DXDraws也许是大家最感兴趣的部分,包括TDX3D、TDXDraw和TDXImageList三个部分。TDX3D为Direct3D高级调用功能控件,
不能单独使用。TDXDraw提供DirectDraw和Direct3D的基础功能。TDXImageList提供一组图象列表支持,也不得单独使用。
以上三者中TDXDraw为基础,也是最重要的部分。
DXInput仅包含TDXInput一个控件,提供输入控制功能,如键盘,摇杆、手柄的操作等等。
DXPlay仅包含TDXPlay一个通讯控件,想支持多人玩离不开它喔!
DXSounds包含TDXSound和TDXWaveList(不要把它想当然以为是Wave单元中的)两个部分,TDXSound是一个DirectSound控件,
TDXWaveList提供WAV列表且不能单独使用。不用多说,声音就全靠它了!
DXSprite只有一个TDXSpriteEngine即“精灵”引擎,如果纯粹是DirectDraw做特效图象处理就没必要用了,做高级游戏肯
定少不了。精灵的移动、创建等等一切控制都在它的掌握中。
Wave仅包含TDXWave,一个波形Wave的控件。提供流的形式处理WAV。
上面初初的介绍了一下DelphiX控件的全部组成部分。希望对大家掌握一个整体概念有所帮助!

下面我们从一个简单例子入手先来初尝DelphiX的味道!主要是进一步增强大家的感性认识。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DXClass, ExtCtrls, DXDraws,
StdCtrls, DIB;

type
TForm1 = class(TDXForm) //和往常大家熟悉的TForm1 = class(TForm)不同了喔!
DXDraw1: TDXDraw;
DXDIB1: TDXDIB;
procedure DXDraw1RestoreSurface(Sender: TObject);
procedure DXDraw1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure DXDraw1InitializeSurface(Sender: TObject);
procedure DXDraw1FinalizeSurface(Sender: TObject);
private
FSurface: TDirectDrawSurface; //表示一块内存区域,用来储存图象数据
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.DXDraw1InitializeSurface(Sender: TObject);
begin
FSurface := TDirectDrawSurface.Create(DXDraw1.DDraw); //创建图像表面
end;

procedure TForm1.DXDraw1FinalizeSurface(Sender: TObject);
begin
FSurface.Free; FSurface := nil; //释放图象表面
end;

procedure TForm1.DXDraw1RestoreSurface(Sender: TObject);
begin
FSurface.LoadFromGraphic(DXDIB1.DIB); //将位图载入创建好的表面
end;

procedure TForm1.DXDraw1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not DXDraw1.CanDraw then Exit; //在画图之前检验是否允许
DXDraw1.Surface.Draw(X-FSurface.Width div 2, Y-FSurface.Height div 2,
FSurface.ClientRect, FSurface, True); //图象数据存入内存
DXDraw1.Flip; //将内存中的表面映射到显存即屏幕显示
end;

end.

很多朋友一定会大呼过瘾吧!^_^ 但上面的代码毛病不少,看起来不是那么完美喔?最起码鼠标一动留下的残影明显
不会消失,怎么办?
呵呵!试试在if not DXDraw1.CanDraw then Exit; 一句下面加上
DXDraw1.Surface.Fill(0);
发现了什么?你一定会说“为什么会这样呢?”聪明的你一定猜得到!
呵呵!这个例子很简单,不过从下次开始我们将对每个控件一一结合实例剖析!
哇哇!打字真的好累啊!I want to sleep !^_^
 
写的好,来个系列的,加油!!!
 
哪里有下载delphiX的?
 
精彩!
捧场!!
听课!!!
 
请问: DXDraw1.Surface.Fill(0); 是在内存还是在显存里填充
DXDraw1.Surface.Draw(...); 呢 ? 能否把 FSurface 里的数据直接送到显存里 ?
DXDraw1.Flip; 又是在干什么?

还有: DXDIB1.DIB 的内容在程序启动时是在内存里吧?
那......算算, 内存和显存里有多少份该图像的副本?

不知道怎么问? 可能问得比较荒唐! 但本人确实只有这个能力...
 
不好意思! 还有一个:

TForm1 = class(TDXForm)
TDXForm 是从哪里来的 ? 写成 TForm1 = class(TForm) 也可以呀 !
是否 DelphiX 的程序都要这样手工去修改?
 
好呀,真得很好也!
 
暂时看不懂,收藏。
 
???
大家怎么不来呀?
 
可惜我的系统是NT,什么都用不了
 
楼上的兄弟不要泄气,我有一套 DelphiX NT !(只是不支持Alpha)
你要的话,可以留下Email!
 
YB_unique : 最好不要用DelphiX吧 ,用标准的 Direct X SDK好些,
至少可以和MSDN看齐呀。
 
YB_unique, 兄:
多大呀,我看我的邮箱够用不,现在的免费邮箱都越来越小了,发点什么都费劲
先发这看能收到不zhyswww@sina.com
多谢了
 
怎么不回答我的问题呢???
5555.........

YB_unique兄,能不能介绍一下 Alpha 通道
 
呵呵,我也来学习学习
 
TO cqbaobao:
在DirectDraw中,系统默认Surface是优先开在显示内存里面的。
TDXForm 是转为DirectX优化过的TForm。
Alpha 通道主要是提供一个相对独立的用于添加、编辑像素灰度信息的场所,
为使图象层向着设计的方向变化作信息储备。

TO GGCAT:
言之有理!我已经很少用DelphiX了!不过考虑到容易入门罢了!
C语言资源太丰富了!能往它靠就尽力靠吧!^_^
 
多人接受答案了。
 
顶部