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

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Button1: TButton; Label5: TLabel; procedure Button1Click(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; 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; //对这段代码不明白,大概的理解是根据起始坐标和目的坐标计算火球消失的的目标 最大是500,
//但是这个算法很奇怪,如果水平或者垂线就会 坐标为0 ,
//于是挖出来做了个程序,看明白了,就是想实现射线的延长功能,但又不想用算力进行科学计算,于是简化了下,
if fireX <> targetX then tax := Abs(targetX - fireX) else tax := 1; 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); end; end.