⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rei_14.pas

📁 Delphi经典游戏程序设计40例.pdf 中国铁道出版社出版 含源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        nX := X;
        nY := Y;
      end;
      if m < Tate then
      begin
        Make_Bmap.Canvas.CopyMode := cmSrcPaint;
        for n := 0 to (Yoko - 1) do
        begin
          X := (X + 36) mod Yoko;
          Y := (Y + 26) mod Tate;
          Rect_S := Rect(X * 16, Y * 16, X * 16 + 16, Y * 16 + 16);
          Rect_M := Rect(X * 16 + 16, Y * 16 + 16, X * 16 + 32, Y * 16 + 32);
          if Backs = 0 then
            Make_Bmap.Canvas.CopyRect(Rect_M, Back0_Bmap.Canvas, Rect_S)
          else
            Make_Bmap.Canvas.CopyRect(Rect_M, Back1_Bmap.Canvas, Rect_S);
          Make_Bmap.Canvas.CopyRect(Rect_M, Make_Bmap.Canvas, Rect_M);
        end;
      end;
      m := m + 1;
      if m = Tate + 1 then
      begin
        Chan := 0;
        Backs := Backs xor 1;
      end;
      Rect_M := Rect(16, 16, DYoko + 16, DTate + 16);
      Rect_D := Rect(0, 0, DYoko, DTate);
      Rei40_14.Canvas.CopyRect(Rect_D, Make_Bmap.Canvas, Rect_M);
    end;
    //  交换显示(3)的处理
    13: begin
      if m < 16 then
      begin
        //  以黑色去除显示中图案的交换部分(点)
        Bpat_Bmap.Canvas.CopyMode := cmSrcCopy;
        Rect_L := Rect(m * 8 + 32, 64, m * 8 + 40, 72);
        Rect_D := Rect(0, 0, 8, 8);
        Bpat_Bmap.Canvas.CopyRect(Rect_D, Load_Bmap.Canvas, Rect_L);
        Rect_D := Rect(0, 0, DYoko, DTate);
        if Backs = 1 then
        begin
          Back0_Bmap.Canvas.Brush.Bitmap := Bpat_Bmap;
          Back0_Bmap.Canvas.CopyMode := cmMergeCopy;
          Back0_Bmap.Canvas.CopyRect(Rect_D, Back0_Bmap.Canvas, Rect_D);
          Back0_Bmap.Canvas.Brush.Bitmap := Nil;
        end
        else begin
          Back1_Bmap.Canvas.Brush.Bitmap := Bpat_Bmap;
          Back1_Bmap.Canvas.CopyMode := cmMergeCopy;
          Back1_Bmap.Canvas.CopyRect(Rect_D, Back1_Bmap.Canvas, Rect_D);
          Back1_Bmap.Canvas.Brush.Bitmap := Nil;
        end;
        //  在Make_Bmap上制作应该交换的点并将其与显示中的图案合成
        Bpat_Bmap.Canvas.CopyMode := cmNotSrcCopy;
        Rect_L := Rect(m * 8 + 32, 64, m * 8 + 40, 72);
        Rect_D := Rect(0, 0, 8, 8);
        Bpat_Bmap.Canvas.CopyRect(Rect_D, Load_Bmap.Canvas, Rect_L);
        Make_Bmap.Canvas.Brush.Bitmap := Bpat_Bmap;
        Rect_B := Rect(0, 0, DYoko, DTate);
        Rect_M := Rect(16, 16, Dyoko + 16, Dtate + 16);
        Make_Bmap.Canvas.CopyMode := cmMergeCopy;
        if Backs = 0 then
        begin
          Make_Bmap.Canvas.CopyRect(Rect_M, Back0_Bmap.Canvas, Rect_B);
          Make_Bmap.Canvas.CopyMode := cmSrcPaint;
          Make_Bmap.Canvas.CopyRect(Rect_M, Back1_Bmap.Canvas, Rect_B);
        end
        else begin
          Make_Bmap.Canvas.CopyRect(Rect_M, Back1_Bmap.Canvas, Rect_B);
          Make_Bmap.Canvas.CopyMode := cmSrcPaint;
          Make_Bmap.Canvas.CopyRect(Rect_M, Back0_Bmap.Canvas, Rect_B);
        end;
        Make_Bmap.Canvas.Brush.Bitmap := Nil;
        //  将合成过的Make_Bmap显示在Form上
        Rei40_14.Canvas.CopyRect(Rect_B, Make_Bmap.Canvas, Rect_M);
      end
      else begin
        Chan := 0;
        Backs := Backs xor 1;
        if Backs = 0 then
          DiBack0
        else
          DiBack1;
      end;
      m := m + 1;
    end;
    //  交换显示(4)的处理
    14: begin
      Make_Bmap.Canvas.CopyMode := cmSrcCopy;
      for n := 0 to (Tate * 4 - 1) do
      begin
        Rect_S := Rect(m * 8 + 16, n * 4 + 16, DYoko + 8, n * 4 + 18);
        Rect_D := Rect(m * 8 + 24, n * 4 + 16, DYoko + 16, n * 4 + 18);
        Make_Bmap.Canvas.CopyRect(Rect_D, Make_Bmap.Canvas, Rect_S);
        DiBox(m * 8, n * 4, m * 8 + 8, n * 4 + 2);
        Rect_S := Rect(8 + 16, n * 4 + 18, DYoko - m * 8 + 16, n * 4 + 20);
        Rect_D := Rect(16, n * 4 + 18, DYoko - m * 8 + 8, n * 4 + 20);
        Make_Bmap.Canvas.CopyRect(Rect_D, Make_Bmap.Canvas, Rect_S);
        DiBox(DYoko - m * 8 - 8, n * 4 + 2, DYoko - m * 8, n * 4 + 4);
      end;
      m := m + 1;
      if m = Yoko * 2 then
      begin
        Chan := 0;
        Backs := Backs xor 1;
      end;
      Rect_M := Rect(16, 16, DYoko + 16, DTate + 16);
      Rect_D := Rect(0, 0, DYoko, DTate);
      Rei40_14.Canvas.CopyRect(Rect_D, Make_Bmap.Canvas, Rect_M);
    end;
    //  执行後的画面显示
    255: begin
      FmDip;
      Backs := Backs xor 1;
    end;
  end;
end;

procedure TRei40_14.DiBack0;
var
  //  定义局部变量
  X, Y: Byte;
begin
  //  将原有图案(1)复制至Back0_Bmap上
  for Y := 0 to (Tate - 1) do
    for X := 0 to (Yoko - 1) do
      PatDi(7, X * 16, Y * 16, Back0_Bmap);
  ChrDi(SpSiz[0], SpSiz[1], SpPon[0], 282, 72, Back0_Bmap);
  ChrDi(SpSiz[2], SpSiz[3], SpPon[1], 50, 80, Back0_Bmap);
end;

procedure TRei40_14.DiBack1;
var
  //  定义局部变量
  X, Y: Byte;
begin
  //  将原有图案(2)复制至Back1_Bmap上
  for Y := 0 to (Tate - 1) do
    for X := 0 to (Yoko - 1) do
      PatDi(15, X * 16, Y * 16, Back1_Bmap);
  ChrDi(SpSiz[4], SpSiz[5], SpPon[2], 282, 56, Back1_Bmap);
  ChrDi(SpSiz[6], SpSiz[7], SpPon[3], 50, 48, Back1_Bmap);
end;

procedure TRei40_14.FmDip;
begin
  //  描绘至绘制点阵图上并显示在画面上
  Chan := 0;
  Make_Bmap.Canvas.CopyMode := cmSrcCopy;
  Rect_M := Rect(16, 16, DYoko + 16, DTate + 16);
  Rect_S := Rect(0, 0, DYoko, DTate);
  if Backs = 0 then
  begin
    Make_Bmap.Canvas.CopyRect(Rect_M, Back0_Bmap.Canvas, Rect_S);
    Rei40_14.Canvas.Draw(0, 0, Back0_Bmap);
  end
  else begin
    Make_Bmap.Canvas.CopyRect(Rect_M, Back1_Bmap.Canvas, Rect_S);
    Rei40_14.Canvas.Draw(0, 0, Back1_Bmap);
  end;
end;

procedure TRei40_14.DiBox(X1, Y1, X2, Y2: Word);
begin
  //  将非显示的原有图案之一部分描绘至绘制点阵图
  Make_Bmap.Canvas.CopyMode := cmSrcCopy;
  Rect_S := Rect(X1, Y1, X2, Y2);
  Rect_M := Rect(X1 + 16, Y1 + 16, X2 + 16, Y2 + 16);
  if Backs = 0 then
    Make_Bmap.Canvas.CopyRect(Rect_M, Back0_Bmap.Canvas, Rect_S)
  else
    Make_Bmap.Canvas.CopyRect(Rect_M, Back1_Bmap.Canvas, Rect_S)
end;

procedure TRei40_14.Button1Click(Sender: TObject);
begin
  //  交换显示(1)的指定
  if Chan = 0 then
    Chan := 1;
end;

procedure TRei40_14.Button2Click(Sender: TObject);
begin
  //  交换显示(2)的指定
  if Chan = 0 then
    Chan := 2;
end;

procedure TRei40_14.Button3Click(Sender: TObject);
begin
  //  交换显示(3)的指定
  if Chan = 0 then
    Chan := 3;
end;

procedure TRei40_14.Button4Click(Sender: TObject);
begin
  //  交换显示(4)的指定
  if Chan = 0 then
    Chan := 4;
end;

procedure TRei40_14.Button5Click(Sender: TObject);
begin
  //  图案的交换显示
  if Chan = 0 then
  begin
    FmDip;
    Backs := Backs xor 1;
  end;
end;

procedure TRei40_14.ChrDi(Xsiz, Ysiz: Byte; Dpon: Word; X1, Y1: Integer;
  Bmap: TBitmap);
var
  //  定义局部变量
  CDX, CDY: Byte;
begin
  //  将指定的角色绘制至指定点阵图上(重叠显示适用)
  for CDY := 0 to (Ysiz - 1) do
    for CDX := 0 to (Xsiz - 1) do
    begin
      if (X1 + CDX * 16 >= 0) and (X1 + CDX * 16 <= DYoko + 16) and
        (Y1 + CDY * 16 >= 0) and (Y1 + CDY * 16 <= DTate + 16) then
          PatDi(SpDat[Dpon], X1 + CDX * 16, Y1 + CDY * 16, Bmap);
      Dpon := Dpon + 1;
    end;
end;

procedure TRei40_14.PatDi(Pnum: Byte; X1, Y1: Integer; Bmap: TBitmap);
begin
  //  将指定的图案绘制至指定点阵图的指定位置上(重叠显示适用)
  PX := (Pnum and $F) * 16;
  PY := Pnum and $F0;
  Rect_L := Rect(PX, PY, PX + 16, PY + 16);
  Rect_D := Rect(X1, Y1, X1 + 16, Y1 + 16);
  if Pnum <> 0 then
    if Pnum >= PtFull then
    begin
      Bmap.Canvas.CopyMode := cmSrcPaint;
      Bmap.Canvas.CopyRect(Rect_D, Xpat_Bmap.Canvas, Rect_L);
      Bmap.Canvas.CopyMode := cmSrcAnd;
      Bmap.Canvas.CopyRect(Rect_D, Load_Bmap.Canvas, Rect_L);
    end
    else begin
      Bmap.Canvas.CopyMode := cmSrcCopy;
      Bmap.Canvas.CopyRect(Rect_D, Load_Bmap.Canvas, Rect_L);
    end;
end;

procedure TRei40_14.ReDraw(Sender: TObject);
begin
  //  Form画面的重绘
  Rect_M := Rect(16, 16, DYoko + 16, DTate + 16);
  Rect_D := Rect(0, 0, DYoko, DTate);
  Rei40_14.Canvas.CopyRect(Rect_D, Make_Bmap.Canvas, Rect_M);
end;

procedure TRei40_14.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //  将载入用、去除用、粉刷用、显示画面用、绘制用的点阵图释放掉
  Load_Bmap.Free;
  Xpat_Bmap.Free;
  Bpat_Bmap.Free;
  Back0_Bmap.Free;
  Back1_Bmap.Free;
  Make_Bmap.Free;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -