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 ?

 

posted @ 2022-08-10 15:05  D7mir  阅读(90)  评论(0)    收藏  举报