1 Востаннє редагувалося Torbins (17.02.2014 20:29:20)

Тема: Пересування кола за допомогою Timer-а

Доброго дня! Потрібна допомога з анімацією.
Потрібно зробити анімацію як на рисунку -
http://s5.hostingkartinok.com/uploads/images/2014/02/1b1f3fe464b9afec752f346d91fa44eb.jpg

Re: Пересування кола за допомогою Timer-а

ostap4k, а Ви щось пробували робити ?

3

Re: Пересування кола за допомогою Timer-а

Hanter написав:

ostap4k, а Ви щось пробували робити ?

так, тільки в мене кулька тільки в одному напрямку рухається, не знаю як зробити координації таких як на картинці.

4

Re: Пересування кола за допомогою Timer-а

Будь ласка, покажіть свої напрацювання.

5

Re: Пересування кола за допомогою Timer-а

procedure Ris;
begin
  form1.Canvas.Pen.Color:=form1.Color;
  form1.Canvas.Ellipse(x,y,x+30,y+30);
  x:=x+dx;
  form1.Canvas.Pen.Color:=clBlack;
  form1.Canvas.Ellipse(x,y, x+30, y+30) ;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Ris;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
 x:=20;
 y:=50;
 dx:=3;
 form1.canvas.brush.color:=form1.color;
end;
procedure TForm1.Button1Click(Sender: TObject);
 begin
 timer1.Interval:=trunc(1000/Strtoint(Edit1.text)); //Швидкість руху
  if Timer1.Enabled=false then i:=i+1;
 Timer1.Enabled:=true;
end;

Ось, тут коло рухається тільки в одному напрямку.

6

Re: Пересування кола за допомогою Timer-а

ОК, оскільки ви просите саме так - роз'ясню, як вам розібратися із вашою проблемою. Я там бачу ще купу проблем, але, можливо, вам не так це важливо.
Отже, положення кола однозначно задається трьома числами: x, y (координати) і t (час). Решта параметрів - розмір, колір, положення вікна, роздільна здатність екрану - нас зараз не цікавлять. У вас зараз все виглядає так:
x(t) = t
y(y) = y0 (не знаю, яке там початкове значення)
t(n+1) = t(n) + dx

Зауважу, що змінна t у вас не визначена, ви замість неї використовуєте x.
Вже бачите, що треба зробити? Треба:
- (не обов'язково, але для впорядкування бажано) ввести змінну t і нарощувати її по кожному тіку таймера;
- ввести формули, які описуватимуть положення кола (x, y) в залежності від значення t.
Ото й все.
Змінну t дійсно можна задавати неявно (відстежувати потрібні точки за координатами), але простіше буде з явною.
Уявляєте, як зробити потрібні функції? Підказка: можна користуватися if :)

Подякували: ostap4k1

7

Re: Пересування кола за допомогою Timer-а

koala написав:

ОК, оскільки ви просите саме так - роз'ясню, як вам розібратися із вашою проблемою. Я там бачу ще купу проблем, але, можливо, вам не так це важливо.
Отже, положення кола однозначно задається трьома числами: x, y (координати) і t (час). Решта параметрів - розмір, колір, положення вікна, роздільна здатність екрану - нас зараз не цікавлять. У вас зараз все виглядає так:
x(t) = t
y(y) = y0 (не знаю, яке там початкове значення)
t(n+1) = t(n) + dx

Зауважу, що змінна t у вас не визначена, ви замість неї використовуєте x.
Вже бачите, що треба зробити? Треба:
- (не обов'язково, але для впорядкування бажано) ввести змінну t і нарощувати її по кожному тіку таймера;
- ввести формули, які описуватимуть положення кола (x, y) в залежності від значення t.
Ото й все.
Змінну t дійсно можна задавати неявно (відстежувати потрібні точки за координатами), але простіше буде з явною.
Уявляєте, як зробити потрібні функції? Підказка: можна користуватися if :)

ось я зробив, але в мене кулька опускається під кутом, як це виправити?

procedure Ris;
begin
  form1.Canvas.Pen.Color:=form1.Color;
  form1.Canvas.Ellipse(x,y,x+30,y+30);
  x:=x+dx;
  if x>70 then
  y:=dy+60;
   if x>90 then
    y:=dy+80;
    if x>120 then
    y:=dy+100;
  form1.Canvas.Pen.Color:=clBlack;
  form1.Canvas.Ellipse(x,y, x+30, y+30) ;

end;

8

Re: Пересування кола за допомогою Timer-а

ostap4k написав:

ось я зробив, але в мене кулька опускається під кутом, як це виправити?

Вам потрібно зберігати що ви рухали попереднього разу, і при кожному спрацьовувані таймера змінювати або х або у;

Нехай буде з тобою сила!

9

Re: Пересування кола за допомогою Timer-а

ostap4k
Умова “if x > 90 then” спрацьовує при значеннях х = 91, 92, 93, 94... Щоб вийшла сходинка, потрібно щоб ця умова виконувалася лише раз при х = 90.

Подякували: ostap4k1

10

Re: Пересування кола за допомогою Timer-а

Torbins написав:

ostap4k
Умова “if x > 90 then” спрацьовує при значеннях х = 91, 92, 93, 94... Щоб вийшла сходинка, потрібно щоб ця умова виконувалася лише раз при х = 90.

Дякую)