Delphi 与 DirectX 之 DelphiX(8): 第一个简单动画


本例效果图(用 gif 动画演示, 无论如何也出不来 DirectX 的流畅效果):

Delphi 与 DirectX 之 DelphiX(8): 第一个简单动画

代码文件:

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


 
   

你可能感兴趣的:(Delphi)