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

Pic028
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.

 

posted @ 2025-08-09 22:24  D7mir  阅读(7)  评论(0)    收藏  举报