本例效果图(用 gif 动画演示, 无论如何也出不来 DirectX 的流畅效果):
代码文件:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXDraws, StdCtrls, DXClass;
type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXTimer1: TDXTimer;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
arr: array of record X,Y,a,b: Integer; end;
PicItem: TPictureCollectionItem;
procedure TForm1.FormCreate(Sender: TObject);
const
ImgPath1 = 'C:\Temp\DelphiX.bmp';
begin
DXDraw1.Align := alClient;
DXImageList1.DXDraw := DXDraw1;
DXImageList1.Items.Add;
PicItem := DXImageList1.Items[DXImageList1.Items.Count-1];
PicItem.Picture.LoadFromFile(ImgPath1);
SetLength(arr, 1);
arr[0].X := Random(DXDraw1.Width - PicItem.Width);
arr[0].Y := Random(DXDraw1.Height - PicItem.Height);
arr[0].a := 1;
arr[0].b := 1;
Button1.Caption := '-';
Button2.Caption := '+';
DXTimer1.Interval := 10;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Length(arr) > 1 then SetLength(arr, Length(arr)-1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SetLength(arr, Length(arr)+1);
arr[High(arr)].X := Random(DXDraw1.Width - PicItem.Width);
arr[High(arr)].Y := Random(DXDraw1.Height - PicItem.Height);
arr[High(arr)].a := 1;
arr[High(arr)].b := 1;
end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
i: Integer;
begin
DXDraw1.Surface.Fill(0);
for i := 0 to Length(arr) - 1 do
begin
if arr[i].X > DXDraw1.Width - PicItem.Width then arr[i].a := -1;
if arr[i].Y > DXDraw1.Height - PicItem.Height then arr[i].b := -1;
if arr[i].X = 0 then arr[i].a := 1;
if arr[i].Y = 0 then arr[i].b := 1;
Inc(arr[i].X, arr[i].a);
Inc(arr[i].Y, arr[i].b);
PicItem.Draw(DXDraw1.Surface, arr[i].X, arr[i].Y, 0);
end;
DXDraw1.Flip;
end;
end.
窗体文件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 250
ClientWidth = 384
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
DesignSize = (
384
250)
PixelsPerInch = 96
TextHeight = 13
object DXDraw1: TDXDraw
Left = 8
Top = 8
Width = 265
Height = 137
AutoInitialize = True
AutoSize = True
Color = clBlack
Display.FixedBitCount = False
Display.FixedRatio = True
Display.FixedSize = True
Options = [doAllowReboot, doWaitVBlank, doCenter, do3D, doDirectX7Mode, doHardware, doSelectDriver]
SurfaceHeight = 137
SurfaceWidth = 265
TabOrder = 0
Traces = <>
end
object Button1: TButton
Left = 321
Top = 217
Width = 24
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Button1'
TabOrder = 1
OnClick = Button1Click
ExplicitLeft = 344
ExplicitTop = 232
end
object Button2: TButton
Left = 351
Top = 217
Width = 25
Height = 25
Anchors = [akRight, akBottom]
Caption = 'Button2'
TabOrder = 2
OnClick = Button2Click
ExplicitLeft = 374
ExplicitTop = 232
end
object DXImageList1: TDXImageList
Items.ColorTable = {
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000}
Items = <>
Left = 40
Top = 152
end
object DXTimer1: TDXTimer
ActiveOnly = True
Enabled = True
Interval = 1000
OnTimer = DXTimer1Timer
Left = 8
Top = 152
end
end