Delphi 经典游戏程序设计40例 的学习 例5 复合图案的时间差移动


 

unit rei40_05;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;



type
  TPatDt  = record
    Xpos : Integer;
    Ypos : Integer;
    Xsize : Byte;
    Ysize : Byte;
    Pban : array[0..15]of Byte;
    end;


  TForm1 = class(TForm)
    tmr1: TTimer;
    tmr2: TTimer;
    tmr3: TTimer;
    tmr4: TTimer;
    tmr5: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure tmr2Timer(Sender: TObject);
    procedure tmr3Timer(Sender: TObject);
    procedure tmr4Timer(Sender: TObject);
    procedure tmr5Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure PatDi(Pnum:Byte;X1,Y1:Word;Bmap:TBitmap);
    procedure ChrDi(Cnum:TPatDt;Bmap:TBitmap);
    procedure ChrCl(Cnum:TpatDt;Bmap:TBitmap);


  public
    { Public declarations }
  end;
const
  Yoko = 37;
  Tate = 27;
  DYoko = Yoko * 16;
  DTate = Tate * 16;

var
  Form1: TForm1;

  LoadBmap : TBitmap;
  MakeBmap : TBitmap;

  PX,PY,n :Byte;

  RectL,RectM,RectD : TRect;

  Chr1,Chr2,Chr3,Chr4 : TPatDt;


implementation

{$R *.dfm}
 procedure TForm1.PatDi(Pnum:Byte;X1,Y1:Word;Bmap:TBitmap);
 begin
  PX :=(Pnum mod 16) *16;
  PY := (Pnum div 16) *16;
  RectL := Rect(PX,PY,PX+16,PY+16);
  RectD :=Rect(X1,Y1,X1+16,Y1+16);
  Bmap.Canvas.CopyMode := cmSrcCopy;
  Bmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectL);
   end;



procedure TForm1.ChrDi(Cnum:TPatDt;Bmap:TBitmap);
var
  x,y : Byte;
begin
  n :=0;
  for y :=0 to (Cnum.Ysize-1 ) do
    for x:=0 to (Cnum.Xsize-1) do
    begin
      PatDi(Cnum.Pban[n],Cnum.Xpos+x*16,Cnum.Ypos+y*16,Bmap) ;
      n:=n+1;

    end;
end;

procedure TForm1.ChrCl(Cnum:TpatDt;Bmap:TBitmap);
var
  x,y : Byte;

begin
   for y:=0 to (Cnum.Ysize-1) do
     for x:=0 to (Cnum.Xsize-1) do
     begin
       PatDi(2,Cnum.Xpos+x*16,Cnum.Ypos + y*16,Bmap);
     end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  x,y :Byte;

begin
  Form1.Height :=480;
  Form1.Width  :=640;
  Form1.Canvas.CopyMode := cmSrcCopy;

  LoadBmap := TBitmap.Create;
  LoadBmap.LoadFromFile(GetCurrentDir +'\Pat_Sample.bmp');

  MakeBmap :=TBitmap.Create;
  MakeBmap.Height :=DTate;
  MakeBmap.Width :=DYoko;

  MakeBmap.Canvas.CopyMode :=cmSrcCopy;
  for y:=0 to (Tate-1) do
    for x:=0 to (Yoko-1)do
    PatDi(2,x*16,y*16,MakeBmap);

  with Chr1 do
  begin
    Xpos := DYoko -32;
    Ypos := 50;
    Xsize :=1;
    Ysize :=2;
    Pban[0]:=5;
    Pban[1]:=6;
  end;

  with Chr2 do
  begin
    Xpos := DYoko -32;
    Ypos := 150;
    Xsize :=2;
    Ysize :=1;
    Pban[0]:=3;
    Pban[1]:=4;
  end;

  with Chr3 do
  begin
    Xpos := DYoko -32;
    Ypos := 250;
    Xsize :=1;
    Ysize :=2;
    Pban[0]:=5;
    Pban[1]:=6;
  end;

  with Chr4 do
  begin
    Xpos := DYoko -32;
    Ypos := 350;
    Xsize :=2;
    Ysize :=1;
    Pban[0]:=3;
    Pban[1]:=4;
  end;


end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  ChrDi(Chr1,MakeBmap);
  ChrDi(Chr2,MakeBmap);
  ChrDi(Chr3,MakeBmap);
  ChrDi(Chr4,MakeBmap);
  Form1.Canvas.Draw(0,0,MakeBmap);
end;

procedure TForm1.tmr2Timer(Sender: TObject);
begin
  ChrCl(Chr1,MakeBmap);
  Chr1.Xpos := Chr1.Xpos -1;
  if Chr1.Xpos < 0 then
  Chr1.Xpos := DYoko - 32;
end;

procedure TForm1.tmr3Timer(Sender: TObject);
begin
  ChrCl(Chr2,MakeBmap);
  Chr2.Xpos := Chr2.Xpos -1;
  if Chr2.Xpos < 0 then
  Chr2.Xpos := DYoko - 32;

end;

procedure TForm1.tmr4Timer(Sender: TObject);
begin
ChrCl(Chr3,MakeBmap);
  Chr3.Xpos := Chr3.Xpos -1;
  if Chr3.Xpos < 0 then
  Chr3.Xpos := DYoko - 32;
end;

procedure TForm1.tmr5Timer(Sender: TObject);
begin
ChrCl(Chr4,MakeBmap);
  Chr4.Xpos := Chr4.Xpos -1;
  if Chr4.Xpos < 0 then
  Chr4.Xpos := DYoko - 32;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  LoadBmap.Free;
  MakeBmap.Free;
end;

end.

学习点

1,记录的类型

2,在类里面加入自己编写的 过程,称为方法。

3,方法的分解,将一个复杂的方法 分解成几个 简单的 可以了重复调用的方法。