![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |