Delphi 经典游戏程序设计40例 的学习 例31 白点是目标

 

 

unit R31;

interface

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

type
  TRei31 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Rei31: TRei31;
  MakeBmap : TBitmap;
  RectD : TRect;
  St : Byte;
  CHeight,CWidth,CT : Word;
  X1,Y1,X2,Y2,QX,QY : Integer;
  TR1,DR1,TR2,DR2,QTR,TX,TY : Extended;



implementation

{$R *.dfm}

procedure TRei31.FormCreate(Sender: TObject);
begin
  CHeight := Rei31.ClientHeight;  //设置操作区域大小
  CWidth := 570;

  MakeBmap := TBitmap.Create;
  MakeBmap.Width := CWidth;
  MakeBmap.Height := CHeight;
  
end;

procedure TRei31.Timer1Timer(Sender: TObject);
begin
  with Rei31 do
    case St of
      0: begin     //模式0
        RectD := Rect(0,0,CWidth,CHeight);   //刷黑
        Canvas.Brush.Color := clBlack;
        Canvas.FillRect(RectD);
        MakeBmap.Canvas.Brush.Color := clBlack;
        MakeBmap.Canvas.FillRect(RectD);

        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;                  //进入模式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(100 * (Cos(TR2) - Cos(QTR)));
        Y2 := Y2 + Round(100 * (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             //模式2 ,判断各种情况并计算
        QX := X2;
        QY := Y2;
        TX := X1 - X2;
        TY := Y1 - Y2;
        if TX = 0 then
          DR2 := Pi / 2              //求得DR
        else
          DR2 := ArcTan(TY / TX);
        if ((TX <= 0) and (TY <= 0)) or ((TX < 0) and (TY > 0)) then
          DR2 := DR2 + Pi;
        St := 3;          //进入模式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;
        MakeBmap.Canvas.Pixels[X2,Y2] := clBlue;
        MakeBmap.Canvas.Pixels[X2,Y2 + 1] := clBlue;
        MakeBmap.Canvas.Pixels[X2 + 1,Y2] := clBlue;
        MakeBmap.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    //到达边界则重新到模式2 初始
          (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 TRei31.Button1Click(Sender: TObject);
begin
  if St = 1 then
    St := 2
  else if St = 3 then
    St := 0;
end;

procedure TRei31.FormPaint(Sender: TObject);
begin
  Rei31.Canvas.CopyMode := cmSrcCopy;
  Rei31.Canvas.Draw(0,0,MakeBmap);
end;

procedure TRei31.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MakeBmap.Free;
end;

end.

1,程序框架和上例相同

2,同样是对三角函数的应用,不明白

posted @ 2022-09-28 17:16  D7mir  阅读(51)  评论(0)    收藏  举报