Delphi 经典游戏程序设计40例 的学习 复习 图像拷贝的几种模式效果?

原图样库,白色为透明色
图样库刷黑,黑色为透明色
原图样库取反后和刷黑图样库 或,得到去除用模板。只有黑白2中透明色,形成轮廓?
例22中的Z3Bmap,加工过的图样库。
unit ImageView; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TMainView = class(TForm) Button1: TButton; ImageLabel: TLabel; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } procedure PatDz(Pnum:Byte;X1,Y1:Integer;Bmap,Zmap:TBitmap); procedure MkDpat(Bmap : TBitmap; ZX : Byte); public { Public declarations } end; const Yoko = 37; Tate = 27; DYoko = Yoko * 16; Dtate = Tate * 16; PtFull = 16; var MainView: TMainView; LoadBmap,XpatBmap,BackBmap,MakeBmap : TBitmap; BpatBmap,Z1Bmap,Z2Bmap,Z3Bmap,Z4Bmap,Z5Bmap :TBitmap; PX,PY : Byte; Count : Byte; RectL,RectB,RectM,RectD : TRect; implementation {$R *.dfm} procedure TMainView.PatDz(Pnum:Byte;X1,Y1:Integer;Bmap,Zmap:TBitmap); begin PX := (Pnum and $F) * 16; PY := Pnum and $F0; RectL := Rect(PX,PY,PX + 16,PY + 16); RectD := Rect(X1,Y1,X1 + 16,Y1 + 16); if Pnum <> 0 then if Pnum >= PtFull then begin Bmap.Canvas.CopyMode := cmSrcPaint; Bmap.Canvas.CopyRect(RectD,XpatBmap.Canvas,RectL); Bmap.Canvas.CopyMode := cmSrcAnd; Bmap.Canvas.CopyRect(RectD,Zmap.Canvas,RectL); end else begin Bmap.Canvas.CopyMode := cmSrcCopy; Bmap.Canvas.CopyRect(RectD,Zmap.Canvas,RectL); end; end; //制作残留图像用的图案 ,ZX 偏移 点数 procedure TMainView.MkDpat(Bmap : TBitmap; ZX : Byte); begin Bmap.Width := 256; Bmap.Height := 256; BpatBmap.Canvas.CopyMode := cmSrcCopy; //调取特定位置图案,8*8 的大小?调取点数是随意额? //调取的就是随意选择的,并不是特定的图案 RectL := Rect(ZX * 8 + 32,64,ZX * 8 + 40,72); RectD := Rect(0,0,8,8); BpatBmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectL); //图案作为笔刷, Bmap.Canvas.Brush.Bitmap := BpatBmap; Bmap.Canvas.CopyMode := cmMergeCopy; //全刷了一遍 RectL := Rect(0,0,256,256); Bmap.Canvas.CopyRect(RectL,LoadBmap.Canvas,RectL); //和 去除用点阵图 ,但还是用了去除模板,做外框? Bmap.Canvas.CopyMode := cmMergePaint; Bmap.Canvas.CopyRect(RectL,XpatBmap.Canvas,RectL); Bmap.Canvas.Brush.Bitmap := nil; end; procedure TMainView.FormCreate(Sender: TObject); begin Count := 1; //载入图案库 LoadBmap := TBitmap.Create; LoadBmap.LoadFromFile(GetCurrentDir + '\Pat_Sample.bmp'); //存储去除用点阵图 XpatBmap := TBitmap.Create; XpatBmap.Width := 256; XpatBmap.Height := 256; //制作去除用点阵图 RectL := Rect(0,0,256,256); XpatBmap.Canvas.CopyMode := cmSrcCopy; XpatBmap.Canvas.CopyRect(RectL,LoadBmap.Canvas,RectL); XpatBmap.Canvas.Brush.Color := clBlack; XpatBmap.Canvas.BrushCopy(RectL,LoadBmap,RectL,clWhite); XpatBmap.Canvas.CopyMode := cmMergePaint; XpatBmap.Canvas.CopyRect(RectL,LoadBmap.Canvas,RectL); //笔刷用点阵图 BpatBmap := TBitmap.Create; BpatBmap.Width := 16; BpatBmap.Height := 16; //残留图像用点阵图 Z1Bmap := TBitmap.Create; Z2Bmap := TBitmap.Create; Z3Bmap := TBitmap.Create; Z4Bmap := TBitmap.Create; Z5Bmap := TBitmap.Create; //制作残留图像点阵图 MkDpat(Z1Bmap,3); MkDpat(Z2Bmap,6); MkDpat(Z3Bmap,8); MkDpat(Z4Bmap,10); MkDpat(Z5Bmap,12); //制作背景点阵图 BackBmap := TBitmap.Create; BackBmap.Width := DYoko; BackBmap.Height := Dtate; //绘制点阵图, MakeBmap := TBitmap.Create; MakeBmap.Width := 256; MakeBmap.Height := 256; end; procedure TMainView.FormClose(Sender: TObject; var Action: TCloseAction); begin LoadBmap.Free; XpatBmap.Free; BackBmap.Free; MakeBmap.Free; BpatBmap.Free; Z1Bmap.Free; Z2Bmap.Free; Z3Bmap.Free; Z4Bmap.Free; Z5Bmap.Free; end; procedure TMainView.Button1Click(Sender: TObject); begin Count := Count + 1; if Count = 10 then Count := 1; end; procedure TMainView.Timer1Timer(Sender: TObject); begin case Count of 1 : begin ImageLabel.Caption := 'CopyRect(RectD,LoadBmap.Canvas,RectD)'; MakeBmap.Canvas.CopyMode :=cmSrcCopy; RectD := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectD); end; 2: begin ImageLabel.Caption := 'BrushCopy(RectD,LoadBmap,RectD,clWhite)'; MakeBmap.Canvas.CopyMode :=cmSrcCopy; RectD := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectD); MakeBmap.Canvas.Brush.Color := clBlack; MakeBmap.Canvas.BrushCopy(RectD,LoadBmap,RectD,clWhite); end; 3: begin ImageLabel.Caption := 'CopyMode := cmMergePaint'; MakeBmap.Canvas.CopyMode :=cmSrcCopy; RectD := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectD); MakeBmap.Canvas.Brush.Color := clBlack; MakeBmap.Canvas.BrushCopy(RectD,LoadBmap,RectD,clWhite); MakeBmap.Canvas.CopyMode := cmMergePaint; MakeBmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectD); end; 4: begin ImageLabel.Caption := 'Z1Bmap'; MakeBmap.Canvas.CopyMode :=cmSrcCopy; RectD := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectD,Z1Bmap.Canvas,RectD); end; 5: begin ImageLabel.Caption := '5555'; BpatBmap.Canvas.CopyMode := cmSrcCopy; RectL := Rect(0,16,16,32); RectD := Rect(0,0,16,16); BpatBmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectL); MakeBmap.Canvas.Brush.Bitmap := BpatBmap; MakeBmap.Canvas.CopyMode := cmMergeCopy; RectM := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectM,LoadBmap.Canvas,RectM); end; 6: begin ImageLabel.Caption := 'cmMergePaint'; BpatBmap.Canvas.CopyMode := cmSrcCopy; RectL := Rect(3 * 8 + 32,64,3 * 8 + 40,72); RectD := Rect(0,0,16,16); BpatBmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectL); MakeBmap.Canvas.Brush.Bitmap := BpatBmap; MakeBmap.Canvas.CopyMode := cmMergeCopy; RectM := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectM,LoadBmap.Canvas,RectM); MakeBmap.Canvas.CopyMode := cmMergePaint; MakeBmap.Canvas.CopyRect(RectM,XpatBmap.Canvas,RectM); MakeBmap.Canvas.Brush.Bitmap := nil; end; 7: begin ImageLabel.Caption := 'Z3Bmap'; MakeBmap.Canvas.CopyMode :=cmSrcCopy; RectD := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectD,Z3Bmap.Canvas,RectD); end; 8: begin ImageLabel.Caption := 'Z5Bmap'; MakeBmap.Canvas.CopyMode :=cmSrcCopy; RectD := Rect(0,0,255,255); MakeBmap.Canvas.CopyRect(RectD,Z5Bmap.Canvas,RectD); end; end; MainView.Canvas.CopyMode := cmSrcCopy; RectD := Rect((DYoko-255) div 2,(Dtate - 255) div 2, (DYoko+255) div 2 ,(Dtate + 255) div 2 ) ; RectM := Rect(0,0,255,255); MainView.Canvas.CopyRect(RectD,MakeBmap.Canvas,RectM); end; end.
1,SPRITE 贴图 过程没有用上。
2,程序框架 和例22 一样?
3,COPYMODE ?