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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2009, 21:53   #1
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию анимация

Здравствуйте, помогите пожалуйстанемогу сообразить как сделать чтобы два тела начали двигаться одновременно.
заранее спасибо.
Код:
procedure TForm1.FormActivate(Sender: TObject);
  var i:byte;
  begin
   AlphaBlend:=True;
   for i:=0 to 127 do
  begin
   form1.AlphaBlendValue:=i*2;
   form1.Repaint
  end
  end;

   procedure Cart(x,y:INTEGER);
   begin
   with Form1.Image1.Canvas DO
     begin
         // телега
   brush.Color:= clRed;
   pen.Color:=clblack;
   Rectangle (x,y,x+100,y+5);
   Ellipse(x+10,y+5,x+30,y+25);
   Ellipse(x+70,y+5,x+90,y+25);

    end;
    end;

    procedure Person(x,y:INTEGER);
   begin
   with Form1.Image1.Canvas DO
   begin
  // человек
    brush.Color:= clRed;
    pen.Color:=clblack;
    Ellipse(x+5,y,x+20,y+15);
    polygon([point(x,y+15), point(x+10,y+40),
    point(x+25,y+15),point(x,y+15)]);
   // MoveTo(255,105);
  //  LineTo(255,125);
   // MoveTo(280,105);
   // LineTo(280,125);
   // MoveTo(262,125);
  //  LineTo(262,145);
  //  MoveTo(270,125);
  //  LineTo(270,145);
    end;
 end;

procedure TForm1.FormCreate(Sender: TObject);
  begin
  With Image1.Canvas do
  begin

 //  Image1.Canvas.Brush.Color:=RGB(55,155,255);
  //Image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height));
    // телега
     brush.Color:= clRed;
   pen.Color:=clblack;
    Ellipse(320,150,340,170);
    Ellipse(260,150,280,170);
    Rectangle (250,145,350,150);
    // человек
   brush.Color:= clRed;
   pen.Color:=clblack;
    polygon([point(260,105),point(270,130),point(285,105),point(260,105)]);
    Ellipse(265,90,280,105);
    //MoveTo(255,105);
   // LineTo(255,125);
  //  MoveTo(280,105);
  //  LineTo(280,125);
  //  MoveTo(262,125);
  //  LineTo(262,145);
   // MoveTo(270,125);
  //  LineTo(270,145);

     DoubleBuffered:=true;
     sss:=TBitMap.Create;
     sss.Width:=CartWidth;
     sss.Height:=CartHeight;

   aaa:=TBitMap.Create;
   aaa.Width:=PersonWidth;
   aaa.Height:=PersonHeight;

   end;
end;


procedure TForm1.Button1Click(Sender: TObject);
  var   t,x,y:word;
  begin
  with Image1.Canvas do
      begin
         t:=10;
          for x:=250 TO 400 DO
        begin
         if t>0 then
         t:=t+1;
         sss.Canvas.CopyRect(Rect(0,0,sss.Width,sss.Height),
         Image1.Canvas,Rect(x,145,CartWidth+x,145+CartHeight));
         CART(x,145);
         label1.Caption:=IntToStr(152-t)+'м/ч';
         Application.ProcessMessages;
         Sleep(t);
         Image1.Canvas.Draw(x,145,sss);

   brush.Color:= RGB(55,155,255);
   pen.Color:=RGB(55,155,255);
    Ellipse(320,150,340,170);
    Ellipse(260,150,280,170);
    Rectangle (250,145,350,150);

     if x=400      then
    brush.Color:= clRed;
     if x=400      then
   pen.Color:=clblack;
    Ellipse(470,150,490,170);
    Ellipse(410,150,430,170);
    Rectangle (400,145,500,150);
  end;


     begin
       t:=100;
    for x:=260 downTO 210 DO
        begin
         Sleep(t);
         if t>0 then
         t:=t-1;
         aaa.Canvas.CopyRect(Rect(0,0,aaa.Width,aaa.Height),
         Image1.Canvas,Rect(x,90,PersonWidth+x,90+PersonHeight));
         Person(x,90);
         Application.ProcessMessages;
         Image1.Canvas.Draw(x,90,aaa);

   brush.Color:= RGB(55,155,255);
   pen.Color:=RGB(55,155,255);
   Ellipse(265,90,280,105);
   polygon([point(260,105),point(270,130),point(285,105),point(260,105)]);

    {  t:=100;
      for y:=90 TO 105 DO

        begin
       Sleep(t);
         if t>0 then
         t:=t-1;
         Person(210,y);
         Application.ProcessMessages;
         Image1.Canvas.Draw(210,y,aaa); }


   // if y=115 then
         //  brush.Color:= clRed;
   //  if y=115 then
         //   pen.Color:=clblack;
         //   Ellipse(215,105,230,120);
        //   polygon([point(210,120),point(220,145),point(235,120),point(210,120)]);

      end;
     end;
    end;
  end;
  //end;
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!

Последний раз редактировалось serj-07; 30.12.2009 в 22:07.
serj-07 вне форума Ответить с цитированием
Старый 04.01.2010, 18:08   #2
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию

Всем спасибо. Попробую уточнить вопрос: Нужно чтобы было движение по форме. У меня получается что телега движется первая и когда она останавливается начинает прыгать человек. Нужно чтобы они начинали двигаться одновременно после нажатии кнопки.

Код:
procedure TForm1.Button1Click(Sender: TObject);
  var   t,x,y:word;
  begin
  with Image1.Canvas do
      begin
         t:=10;
          for x:=250 TO 400 DO
        begin
         if t>0 then
         t:=t+1;
         sss.Canvas.CopyRect(Rect(0,0,sss.Width,sss.Height),
         Image1.Canvas,Rect(x,145,CartWidth+x,145+CartHeight));
         CART(x,145);
         label1.Caption:=IntToStr(152-t)+'м/ч';
         Application.ProcessMessages;
         Sleep(t);
         Image1.Canvas.Draw(x,145,sss);
  end;


     begin
       t:=100;
    for x:=260 downTO 210 DO
        begin
         Sleep(t);
         if t>0 then
         t:=t-1;
         aaa.Canvas.CopyRect(Rect(0,0,aaa.Width,aaa.Height),
         Image1.Canvas,Rect(x,90,PersonWidth+x,90+PersonHeight));
         Person(x,90);
         Application.ProcessMessages;
         Image1.Canvas.Draw(x,90,aaa);

  
      t:=100;
      for y:=90 TO 105 DO

        begin
       Sleep(t);
         if t>0 then
         t:=t-1;
         Person(210,y);
         Application.ProcessMessages;
         Image1.Canvas.Draw(210,y,aaa); }

      end;
заранее благодарю. если можно то поправте в коде.
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!
serj-07 вне форума Ответить с цитированием
Старый 04.01.2010, 21:42   #3
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Поправлю в самом алгоритме. Процедуры движения нескольких объектов следует организовывать в одном и том же цикле ( или таймере).
Т.е. за одну итерацию цикла (за один интервал таймера) производите перемещение каждого объекта анимации на один шаг. При следующей итерации (интервале) сдвиг ВСЕХ объектов на следующий шаг. И т.д.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 04.01.2010, 23:06   #4
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию

я пробывал поставить в один цикл не получилось.
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!
serj-07 вне форума Ответить с цитированием
Старый 04.01.2010, 23:38   #5
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

вот посмотри механизм движения на примитивном примере:
вставляеш например в таймер данные строки
Код:
// движение на 1 пиксель телеги  вправо (image1)  
begin
image1.left:=image1.left+1;
//здесь же вставляешь движение человечка верх допустим тоже на 1 пиксель (image2)
image2.top:=image2.top-1;
end;
т. е. допустим таймер стоит из кулдауном у тебя 100 мс. и получается что каждую секунду телега и человек будут двигаться по заданной им траектории на 10 пикселей, т. е. процедура запустится 10 раз, и когда она запускается то она будет работать для них одновременно, так как ты и хотел.
Надеюсь ясно объяснил ?) Если нет то могу в твоем коде подправить так что бы было одновременное движение.
Deamonig вне форума Ответить с цитированием
Старый 05.01.2010, 07:52   #6
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию

Deamonig большое спасибо. если млжно то поправь в коде пожалуйстa. Я ни как немогу сообразить.
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!

Последний раз редактировалось serj-07; 05.01.2010 в 08:10.
serj-07 вне форума Ответить с цитированием
Старый 05.01.2010, 08:10   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

serj-07, Вы бы лучше выложили целиком исходники проекта (запакуйте исходные файлы в архив, архив прикрепите к сообщению на форуме).
Тогда было бы проще Вам помочь...

Главная мысль, которую Вам пытаются донести DeKot и Deamonig - это то, что вместо циклов по нажатию кнопки, нужно, чтобы кнопка включала timer (киньте таймер на форму), в обработчике таймера нужно изменять координату одного объекта (телеги) и ТУТ ЖЕ, сразу, в этом же обработчике, изменять координату второго объекта (человека)!

Таким образом, "поправь в коде пожалуйсто" - это надо переписать Ваш алгоритм движения!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2010, 08:24   #8
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию

исходник проекта
Вложения
Тип файла: rar графика.rar (173.3 Кб, 20 просмотров)
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!

Последний раз редактировалось serj-07; 05.01.2010 в 16:24. Причина: правка исходника
serj-07 вне форума Ответить с цитированием
Старый 05.01.2010, 08:31   #9
Deamonig
Форумчанин
 
Аватар для Deamonig
 
Регистрация: 19.09.2009
Сообщений: 166
По умолчанию

Выложи исходник, днем приду помогу, если до этого никто не сделает ), а щас на учебу побежал

В общем смори я написал программу реализующею одновременное движение телеги и человека, с помощью таймера битмапов и канваса.
Телегу и человечка я рисовал сам ( эллипс и прямоугольник ), но как я описал в комментариях для лучшего вида можно загрузить и из файла.
Так же я не использовал никаких формул для движения, т. е. они движутся с одной скоростью (10 пикселей в секунду).
В коде программы оставил множество комментариев, которые тебе несомненно помогут )
Вложения
Тип файла: rar графика курсовая.rar (167.2 Кб, 32 просмотров)

Последний раз редактировалось mihali4; 07.01.2010 в 18:40.
Deamonig вне форума Ответить с цитированием
Старый 05.01.2010, 16:28   #10
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию

Огромное человеческое спасибо!!!
сейчас посмотрю.
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!
serj-07 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анимация nimf Общие вопросы Delphi 6 07.08.2009 10:21
Анимация в С++ Streb Общие вопросы C/C++ 28 07.06.2009 19:07
анимация Juffin Общие вопросы Delphi 2 26.05.2009 20:04
Анимация BuTeK1 Паскаль, Turbo Pascal, PascalABC.NET 0 19.01.2009 00:30
Анимация SanekIrk Общие вопросы Delphi 11 08.08.2008 15:24