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

📄 rei_31.pas

📁 Delphi经典游戏程序设计40例.pdf 中国铁道出版社出版 含源码
💻 PAS
字号:
unit Rei_31;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, Menus, StdCtrls;

type
  TRei40_31 = class(TForm)
    Timer1: TTimer;
    MainMenu1: TMainMenu;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ReDraw(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 定义 }
  public
    { Public 定义 }
  end;

var
  Rei40_31: TRei40_31;
  //  定义重绘用的点阵图
  Make_Bmap: TBitmap;
  //  定义各种变量类型(Byte、Word、Integer、Extended、TRect)
  St: Byte;
  Cheight, Cwidth, CT: Word;
  X1, Y1, X2, Y2, QX, QY: Integer;
  TR1, DR1, TR2, DR2, QTR, TX, TY: Extended;
  Rect_D: TRect;

implementation

{$R *.DFM}

procedure TRei40_31.FormCreate(Sender: TObject);
begin
  //  设定Form属性
  Rei40_31.Height := 480;
  Rei40_31.Width := 640;
  Button1.Height := 41;
  Button1.Left := 580;
  Button1.Top := 16;
  Button1.Width := 41;
  Cheight := Rei40_31.ClientHeight;
  Cwidth := 570;
  //  储存重绘用点阵图
  Make_Bmap := TBitmap.Create;
  Make_Bmap.Width := Cwidth;
  Make_Bmap.Height := Cheight;
end;

procedure TRei40_31.Timer1Timer(Sender: TObject);
begin
  with Rei40_31 do
    case St of
      //  若St=0则将画面与变量初始化
      0: begin
        Rect_D := Rect(0, 0, Cwidth, Cheight);
        Canvas.Brush.Color := clBlack;
        Canvas.FillRect(Rect_D);
        Make_Bmap.Canvas.Brush.Color := clBlack;
        Make_Bmap.Canvas.FillRect(Rect_D);
        X1 := Cwidth div 2;
        Y1 := 117;
        TR1 := -Pi / 2;
        DR1 := 2 * Pi / 180;
        X2 := Cwidth div 2;
        Y2 := 10;
        TR2 := -Pi / 2;
        DR2 := -3 * Pi / 180;
        St := 1;
      end;
      //  让白点与黄点旋转
      1: begin
        Canvas.Pixels[X1, Y1] := clBlack;
        Canvas.Pixels[X1, Y1 + 1] := clBlack;
        Canvas.Pixels[X1 + 1, Y1] := clBlack;
        Canvas.Pixels[X1 + 1, Y1 + 1] := clBlack;
        QTR := TR1;
        TR1 := TR1 + DR1;
        X1 := X1 + Round(100 * (Cos(TR1) - Cos(QTR)));
        Y1 := Y1 + Round(100 * (Sin(TR1) - Sin(QTR)));
        Canvas.Pixels[X1, Y1] := clWhite;
        Canvas.Pixels[X1, Y1 + 1] := clWhite;
        Canvas.Pixels[X1 + 1, Y1] := clWhite;
        Canvas.Pixels[X1 + 1, Y1 + 1] := clWhite;
        Canvas.Pixels[X2, Y2] := clBlack;
        Canvas.Pixels[X2, Y2 + 1] := clBlack;
        Canvas.Pixels[X2 + 1, Y2] := clBlack;
        Canvas.Pixels[X2 + 1, Y2 + 1] := clBlack;
        QTR := TR2;
        TR2 := TR2 + DR2;
        X2 := X2 + Round(217 * (Cos(TR2) - Cos(QTR)));
        Y2 := Y2 + Round(217 * (Sin(TR2) - Sin(QTR)));
        Canvas.Pixels[X2, Y2] := clYellow;
        Canvas.Pixels[X2, Y2 + 1] := clYellow;
        Canvas.Pixels[X2 + 1, Y2] := clYellow;
        Canvas.Pixels[X2 + 1, Y2 + 1] := clYellow;
      end;
      //  计算黄点至白点的弧度
      2: begin
        QX := X2;
        QY := Y2;
        TX := X1 - X2;
        TY := Y1 - Y2;
        if TX = 0 then
          DR2 := Pi / 2
        else
          DR2 := ArcTan(TY / TX);
        if ((TX <= 0) and (TY <= 0)) or ((TX < 0) and (TY > 0)) then
          DR2 := DR2 + Pi;
        St := 3;
        CT := 0;
      end;
      //  黄点冲向白点
      3: begin
        Canvas.Pixels[X2, Y2] := clBlue;
        Canvas.Pixels[X2, Y2 + 1] := clBlue;
        Canvas.Pixels[X2 + 1, Y2] := clBlue;
        Canvas.Pixels[X2 + 1, Y2 + 1] := clBlue;
        Make_Bmap.Canvas.Pixels[X2, Y2] := clBlue;
        Make_Bmap.Canvas.Pixels[X2, Y2 + 1] := clBlue;
        Make_Bmap.Canvas.Pixels[X2 + 1, Y2] := clBlue;
        Make_Bmap.Canvas.Pixels[X2 + 1, Y2 + 1] := clBlue;
        CT := CT + 5;
        X2 := QX + Round(CT * Cos(DR2));
        Y2 := QY + Round(CT * Sin(DR2));
        if (X2 < -1) or (X2 >= Cwidth-2) or
          (Y2 < -1) or (Y2 >= Cheight-2) then
        begin
          St := 2;
          X2 := QX;
          Y2 := QY;
        end;
        Canvas.Pixels[X2, Y2] := clYellow;
        Canvas.Pixels[X2, Y2 + 1] := clYellow;
        Canvas.Pixels[X2 + 1, Y2] := clYellow;
        Canvas.Pixels[X2 + 1, Y2 + 1] := clYellow;
        Canvas.Pixels[X1, Y1] := clWhite;
        Canvas.Pixels[X1, Y1 + 1] := clWhite;
        Canvas.Pixels[X1 + 1, Y1] := clWhite;
        Canvas.Pixels[X1 + 1, Y1 + 1] := clWhite;
      end;
  end;
end;

procedure TRei40_31.Button1Click(Sender: TObject);
begin
  //  黄点冲向白点(旋转中)或重来(攻击中)的指示
  if St = 1 then
    St := 2
  else if St = 3 then
    St := 0;
end;

procedure TRei40_31.ReDraw(Sender: TObject);
begin
  //  重绘Form画面
  Rei40_31.Canvas.CopyMode := cmSrcCopy;
  Rei40_31.Canvas.Draw(0, 0, Make_Bmap);
end;

procedure TRei40_31.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //  将重绘用的点阵图释放掉
  Make_Bmap.Free;
end;

end.

⌨️ 快捷键说明

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