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

Pic004
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,短边的扩大相同倍数的数值,并带入了正负,扩展的方向。

起到一个比例尺?的作用。

这里加入了定时器,进行画点 可以直观的看出小火球的轨迹 是正确的。 

posted @ 2025-08-11 15:15  D7mir  阅读(6)  评论(0)    收藏  举报