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,同样是对三角函数的应用,不明白