![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Имеется такой код(Алгоритм рисования траектории), задача с помощью таймера пустить по этой траектории фигуру, застрял на этом моменте и очень прошу вашей помощи 
		
	
		
		
			Код: 
	var x,y,d,k1,k2,k3,k4,i,j:integer;
begin
//координаты верхнего левого треугольника
x:=100;
y:=100;
//длина катета
d:=50;
moveto(x,y);
for j:=1 to 4 do
 begin
  case j of
  1:begin
    k1:=1;
    k2:=1;
    k3:=0;
    k4:=-1;
    end;
  2:begin
    k1:=-1;
    k2:=1;
    k3:=1;
    k4:=0;
    end;
  3:begin
    k1:=-1;
    k2:=-1;
    k3:=0;
    k4:=1;
    end;
  4:begin
    k1:=1;
    k2:=-1;
    k3:=-1;
    k4:=0;
    end;
  end;
for i:=1 to 5 do
 begin
  if odd(i) then
   begin
    lineto(x+k1*d,y+k2*d);
    x:=x+k1*d;
    y:=y+k2*d;
   end
  else
   begin
    lineto(x+k3*d,y+k4*d);
    x:=x+k3*d;
    y:=y+k4*d;
   end;
 end;
end;Последний раз редактировалось Sulackan, 09.10.2017 в 23:32.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 А чё ты делаешь-то? 
		
	
		
		
		
		
		
	
		
		
	
	
	опиши лучше словами что надо сделать. а то приведенный код вообще непонятен, а смотреть файлы просто лень. В принципе, как все это можно делать через таймер. В таймере ты должен за 1 проход делать 1 шаг. Пусть у нас есть некоторая процедура, которая отрисовывает нужный объект в переданных координатак (DrawObject) и некоторая функция, которая вычисляет следующее положение объекта (NextStep). тогда код должен выглядеть примерно так: Код: 
	type
  TForm1 = class(TForm)
  ...
  prvate
    x, y, dx, dy : integer; // координаты объекта и шаг их изменения
   procedure DrawObject(x,y : integer);
   procedure NextStep(var ax,ay : integer; adx, ady : integer);
  ...
  end;
...
// Инициализация при создании формы
procedure TForm1.FormCreate(Sender : TObject);
begin
  x := 100;
  y := 100;
  dx := 1;
  dy := 3;
  DrawObject(x,y);
end;
// Событие таймера - вычислили новое положение объекта и отрисовали его
procedure TForm1.Timer1Timer(Sender : TObject);
begin
  NextStep(x,y,dx,dy);
  DrawObject(x,y);
end; Ну и в принципе надо не забыть стирать за собой старую отрисовку, если это надо.  | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
Sulackan (09.10.2017)
  | ||
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Вот, пришел домой, быстренько накидал рабочий примерчик броска кирпича вверх (по параболе): 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	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. |