本例效果图(用 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

posted on 2009-01-13 11:54  万一  阅读(4254)  评论(4编辑  收藏  举报