Delphi 经典游戏程序设计40例 的学习 例16 马赛克处理

unit R16; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TRei16 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button4MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button5Click(Sender: TObject); procedure Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button3MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button4MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Timer1Timer(Sender: TObject); private { Private declarations } procedure MosMake(X1,Y1:Word); public { Public declarations } end; const Yoko = 37; Tate = 27; DYoko = Yoko * 16; DTate = Tate * 16; MsSize = 8; //一小块马赛克的大小,点数。 MsYoko = 8; //马赛克的横向数目 MsTate = 8; //马赛克的纵向数目 var Rei16: TRei16; //背景图像,绘制图像 BackBmap,MakeBmap :TBitmap; Mpon :Byte; Mc :Byte = 1; // 马赛克是否 闪烁 MX : Integer = 312-48; //马赛克的位置,并初始 MY : Integer = 224-48; Xadd,Yadd : ShortInt; //移动值 RectB,RectD,RectM : TRect; implementation {$R *.dfm} procedure Trei16.MosMake(X1,Y1:Word); var x,y :Byte; begin //取背景图的规定范围到制作点阵图 RectB := Rect(48,24,640,480-24); RectM := Rect(16,16,DYoko + 16,DTate + 16); MakeBmap.Canvas.CopyRect(RectM,BackBmap.Canvas,RectB); for x := 0 to (MsYoko - 1) do for y := 0 to (MsTate - 1) do begin RectM := Rect(X1 + x * MsSize + 16,Y1 + y * MsSize + 16, X1 + x * MsSize + 16 + MsSize,Y1 + y * MsSize + 16 + MsSize ); //设置笔刷颜色, MakeBmap.Canvas.Brush.Color := //pixels[X,Y] 取得该点颜色?余为X,商为Y MakeBmap.Canvas.Pixels[X1 + x * MsSize + 16 + Mpon mod 8, Y1 + y * MsSize + 16 + Mpon div 8]; MakeBmap.Canvas.FillRect(RectM); end; end; procedure TRei16.FormCreate(Sender: TObject); begin BackBmap := TBitmap.Create; BackBmap.Width := DYoko; BackBmap.Height := DTate; BackBmap.LoadFromFile(GetCurrentDir + '\Bunny.bmp'); MakeBmap := TBitmap.Create; MakeBmap.Width := DYoko + 32; MakeBmap.Height := DTate + 32; MakeBmap.Palette := BackBmap.Palette; end; procedure TRei16.FormClose(Sender: TObject; var Action: TCloseAction); begin BackBmap.Free; MakeBmap.Free; end; procedure TRei16.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Yadd := -MsSize; end; procedure TRei16.Button2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Yadd := MsSize; end; procedure TRei16.Button3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Xadd := -MsSize; end; procedure TRei16.Button4MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Xadd := MsSize; end; procedure TRei16.Button5Click(Sender: TObject); begin Mc := Mc xor 1; end; procedure TRei16.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Yadd := 0; end; procedure TRei16.Button2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Yadd := 0; end; procedure TRei16.Button3MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Xadd := 0; end; procedure TRei16.Button4MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Xadd := 0; end; procedure TRei16.Timer1Timer(Sender: TObject); begin MX := MX + Xadd; MY := MY + Yadd; if MX < 0 then MX := 0; if MX > DYoko - MsYoko * MsSize then MX := DYoko - MsYoko * MsSize; if MY < 0 then MY := 0; if MY > DTate - MsTate * MsSize then MY := DTate - MsTate * MsSize; //mc 为0,MPON不变,mc 为1 ,MPON 会不断递增,但限制在63的范围内。 Mpon := (Mpon + Mc ) and 63; MosMake(MX,MY); Rei16.Canvas.CopyMode := cmSrcCopy; RectM := Rect(16,16,DYoko + 16,DTate + 16); RectD := Rect(0,0,DYoko,DTate); Rei16.Canvas.CopyRect(RectD,MakeBmap.Canvas,RectM); end; end.
1,mosaic 英文单词
2,一个函数
//pixels[X,Y] 取得该点颜色?余为X,商为Y MakeBmap.Canvas.Pixels
3, 鼠标的MouseDown UP
4,程序框架大体一样,也是在TIME中完成绘画