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