Показать сообщение отдельно
  #3  
Старый 10.10.2017, 05:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот, пришел домой, быстренько накидал рабочий примерчик броска кирпича вверх (по параболе):
Код:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm2 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    x, y, v, a : integer;
    procedure DrawObject(ax,ay : integer);
    procedure NextStep(var ax, ay, av : integer; aa: integer);
    procedure TimerStartStop(tmStart : Boolean);
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  TimerStartStop(True);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  TimerStartStop(False);
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  Close;
end;

procedure TForm2.TimerStartStop(tmStart : Boolean);
begin
  Timer1.Enabled := tmStart;
  Button1.Enabled := not Timer1.Enabled;
  Button2.Enabled := Timer1.Enabled;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  x := 0;
  y := 0;
  a := -3;
  v := 100;
  DrawObject(x,PaintBox1.Height-y); // Reverse y
end;

procedure TForm2.DrawObject(ax,ay : integer);
begin
  With PaintBox1.Canvas Do
    begin
      FillRect(Rect(0,0,PaintBox1.Width, PaintBox1.Height));
      MoveTo(ax-3,ay-3);
      LineTo(ax+3,ay-3);
      LineTo(ax+3,ay+3);
      LineTo(ax-3,ay+3);
      LineTo(ax-3,ay-3);
    End;
end;

procedure TForm2.NextStep(var ax, ay, av : integer; aa: integer);
begin
  // s = s0 + vt + at^2/2
  ax := ax + 1;
  av := av + aa*x;
  ay := ax*av + round(aa*sqr(x)/2);

  // end trajectory, start again
  if ay < 0 Then
    begin
      ax := 0;
      ay := 0;
      av := 100;
    end;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  NextStep(x,y,v,a);
  DrawObject(x*10,PaintBox1.Height-y); // Reverse y
end;

end.
Ответить с цитированием