组装17 人物动画的简单实现 发出小火球的轨迹问题2

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Button1: TButton; Label5: TLabel; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; sx, sy, tx, ty, fireX, fireY, targetX, targetY, tax, tay, firedisX, firedisY: Integer; frameTime: LongWord; stepx, stepy, flyX, flyY, ms: Integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin sx := StrToIntDef(Edit1.Text, 400); sy := StrToIntDef(Edit2.Text, 300); tx := StrToIntDef(Edit3.Text, 0); ty := StrToIntDef(Edit4.Text, 0); fireX := sx; fireY := sy; targetX := tx; targetY := ty; if fireX <> targetX then tax := Abs(targetX - fireX) else tax := 1; //为1是为了避免除数为0,错误 if fireY <> targetY then tay := Abs(targetY - fireY) else tay := 1; if abs(fireX - TargetX) > abs(fireY - TargetY) then begin //带入了方向正负,对长度大的进行同倍放大, firedisX := Round((TargetX - fireX) * (500 / tax)); firedisY := Round((TargetY - fireY) * (500 / tax)); end else begin firedisX := Round((TargetX - fireX) * (500 / tay)); firedisY := Round((TargetY - fireY) * (500 / tay)); end; Canvas.Brush.Color := clWindow; Canvas.FillRect(ClientRect); Label5.Caption := 'firedisX,Y: ' + IntToStr(firedisX) + ',' + IntToStr(firedisY); Label1.Repaint; Label2.Repaint; Label3.Repaint; Label4.Repaint; Label5.Repaint; Canvas.Pen.Color := clRed; Canvas.Pen.Width := 1; Canvas.MoveTo(sx, sy); Canvas.LineTo(tx, ty); Canvas.Pen.Color := clGreen; Canvas.Pen.Width := 1; Canvas.MoveTo(fireX, fireY); Canvas.LineTo(firedisX, firedisY); frameTime := GetTickCount; Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin ms := GetTickCount - frameTime; if ms < 2000 then begin stepx := Round(firedisX / 900 * ms); stepy := Round(firedisY / 900 * ms); flyX := fireX + stepx; flyY := fireY + stepy; Canvas.Pixels[flyX, flyY] := clYellow; Canvas.Pixels[flyX + 1, flyY] := clYellow; Canvas.Pixels[flyX, flyY + 1] := clYellow; Canvas.Pixels[flyX + 1, flyY + 1] := clYellow; end else Timer1.Enabled := False; end; end.
对于上一篇,是我的理解错误了,
并不是求延长线的算法, 它是求的长边的长度扩大到500,短边的扩大相同倍数的数值,并带入了正负,扩展的方向。
起到一个比例尺?的作用。
这里加入了定时器,进行画点 可以直观的看出小火球的轨迹 是正确的。