Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2014, 21:02   #1
shadezx
Пользователь
 
Регистрация: 24.10.2013
Сообщений: 75
По умолчанию Timer//Delphi

Доброго времени суток!Нужна помощь с компонентом Timer.
Нужно сделать анимацию шарика как на картинке -

Каждый шар отдельная процедура, только вот в чем проблема, я не могу сделать так чтобы один шарик появлялся,потом следующий, и так далее.
вот мой код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Spin;

type
  TForm1 = class(TForm)
    PaintBox2: TPaintBox;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    CheckBox1: TCheckBox;
    SpinEdit1: TSpinEdit;
    CheckBox2: TCheckBox;
    procedure shar1 (v,w:integer; col1,col2:TColor);
    procedure shar2 (x,y:integer; col1,col2:TColor);
    procedure shar3 (m,n:integer; col1,col2:TColor);
    procedure shar4 (z,c:integer; col1,col2:TColor);
    procedure shar5 (r,t:integer; col1,col2:TColor);
    procedure linii (h,j:integer; col1:TColor);
    procedure Timer1Timer(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);




  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  m,n,z,c,r,t,v,w,x,y,h,j:integer;
implementation

uses DateUtils;
{$R *.dfm}
procedure TForm1.linii (h,j:integer; col1:TColor);
begin
   with Form1.PaintBox2.Canvas do
   begin
    pen.Color:=col1;
    moveto(h+10,j+40);
    lineto(h+50,j+40); //1
    lineto(h+50,j+80);  //2
    lineto(h+90,j+80);     //3
    lineto(h+90,j+120);       //4
    lineto(h+170,j+120);       //5
   end;
end;

procedure TForm1.shar1 (v,w:integer; col1,col2:TColor);
 begin
  with Form1.PaintBox2.Canvas do
begin
pen.Color:=col1;
moveto(v+10,w);
ellipse(v+10,w+9,v+40,w+39);
end;
end;
procedure TForm1.shar2(x,y:integer; col1,col2:TColor);
 begin
  with Form1.PaintBox2.Canvas do
begin
pen.Color:=col1;
moveto(x+10,y);
ellipse(x+60,y+9,x+90,y+39);
end;
end;

procedure TForm1.shar3(m,n:integer; col1,col2:TColor);
 begin
  with Form1.PaintBox2.Canvas do
begin
pen.Color:=col1;
moveto(m+40,n+30); //m--->x
ellipse(m+60,n+50,m+90,n+80);//n--->y
end;
end;

procedure TForm1.shar4 (z,c:integer; col1,col2:TColor);
 begin
  with Form1.PaintBox2.Canvas do
begin
pen.Color:=col1;     //z --> x
moveto(z+70,c+60);      //c--->y
ellipse(z+100,c+50,z+130,c+80);
end;
end;

procedure TForm1.shar5 (r,t:integer; col1,col2:TColor);
 begin
  with Form1.PaintBox2.Canvas do
begin
pen.Color:=col1;
moveto(r+100,t+90);  //r--->x
ellipse(r+100,t+90,r+130,t+120); //t--->y
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
begin
if Timer1.Tag=0
  then
  begin
     shar2(x+10,y,clblue,clblue);
     shar1(v+10,w,color,color);
    Timer1.Tag:=1;
    end
    else
    begin
    shar1(v+10,w,clblue,clblue);
    shar2(x+10,y,clblue,clblue);
     Timer1.Tag:=0;
    end;
end;
end;


procedure TForm1.CheckBox1Click(Sender: TObject);
begin
linii(h,j,clblack,);
 Timer1.Interval:=SpinEdit1.Value;
if CheckBox1.Checked then
Timer1.Enabled:=true
else Timer1.Enabled:=false;
end;


procedure TForm1.CheckBox2Click(Sender: TObject);
begin
shar1(v,w,clblack,clred);
shar2(x,y,clblack,clred);
shar3(m,n,clblack,clblack);
shar4(z,c,clblack,clblack);
shar5(r,t,clblack,clblack);

end;

end.
shadezx вне форума Ответить с цитированием
Старый 16.02.2014, 22:13   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Это делается по-другому. Надо описать модель препятствия, например в виде массива из данных - заполнен ли пиксель или пустой. Шарик же по таймеру проверяет эту заполненность в массиве и смещается в зависимости от неё - либо вправо либо вниз. И не надо никаких отдельных процедур для шарика, т.к. надо всего 2 процедуры - инициализацию всех данных и таймерную.
Если завтра будет время - напишу, переделав отдалённо похожую задачку что решал одному студенту.
phomm вне форума Ответить с цитированием
Старый 16.02.2014, 22:20   #3
shadezx
Пользователь
 
Регистрация: 24.10.2013
Сообщений: 75
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Это делается по-другому. Надо описать модель препятствия, например в виде массива из данных - заполнен ли пиксель или пустой. Шарик же по таймеру проверяет эту заполненность в массиве и смещается в зависимости от неё - либо вправо либо вниз. И не надо никаких отдельных процедур для шарика, т.к. надо всего 2 процедуры - инициализацию всех данных и таймерную.
Если завтра будет время - напишу, переделав отдалённо похожую задачку что решал одному студенту.
буду очень благодарен)
shadezx вне форума Ответить с цитированием
Старый 17.02.2014, 08:28   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

А Вы не ждите у моря погоды, пробуйте делать как я описал.
phomm вне форума Ответить с цитированием
Старый 22.02.2014, 23:16   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Вот накропал FallBall немного перeделав WaterFlow (делал симуляцию на заказ)
Не обращайте внимание на текстовки и т.п. вещи из вотерфлоу, оставшиеся в фолболе.
Функция таймерная, остальное практически неважно и относительно несложно, просто вшито в код симуляции, который я не думаю раскрывать.
Код:
procedure TFallBall.Flow;
var
  CanFall: Boolean;
begin
// предотвращение выпадания за карту
  if not PtInRect(Bounds(0, 0, Map.Size.X, Map.Size.Y),
    Point(BallPos.X + BallSize.X, BallPos.Y + BallSize.Y)) then
  begin
    Stop;
    Exit;
  end;
// если под шариком пусто
  CanFall := Map[BallPos.Y + BallSize.Y, BallPos.X] = ctFree;
// смещение в зависимости от CanFall 
  BallPos := Point(BallPos.X + IfThen(CanFall, 0, 1), BallPos.Y + IfThen(CanFall, 1, 0));
end;
Вложения
Тип файла: zip FallBall.zip (230.5 Кб, 14 просмотров)
Тип файла: zip WaterFlow1.zip (206.1 Кб, 16 просмотров)

Последний раз редактировалось phomm; 22.02.2014 в 23:36.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7 Timer-Image setdsekol Общие вопросы Delphi 0 23.06.2013 19:54
Timer.Canvas[Delphi] MariaD Помощь студентам 7 17.06.2013 12:46
timer delphi Игopь Компоненты Delphi 1 24.02.2013 09:05
delphi и время (Timer) arthur1 Общие вопросы Delphi 12 14.09.2011 22:54
timer Cpluser C# (си шарп) 4 06.09.2011 17:33