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,方法的分解,将一个复杂的方法 分解成几个 简单的 可以了重复调用的方法。