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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2011, 21:10   #1
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
Вопрос как сделать задержку вывода изображения

Здравствуйте. Подскажите пожалуйста, как сделать задержку при выводе изображения для создания эффекта движения. Делала Sleep, ставила таймер - не помогает. После запуска программы ждет положенное время и выводит уже конечное (самое последнее) изображение.
Вот процедура, где происходит рисование от левого до правого края формы. Translation - метод, пересчитывающий координаты фигуры после перемещения:
Код:
  k:=3;
  with Form1 do
    while k < (Image1.Width - 400) do
    begin
      ClearDevice;
      Transform.Translation(3,0);
      Timer1.Enabled:=true;
      DrawNave;
      DrawZenit;
      k:=k+3;
      Timer1.Enabled:=false;
    end;
Заранее спасибо.
pupilMartyr вне форума Ответить с цитированием
Старый 02.05.2011, 21:15   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Я так полагаю, тема анимация в Делфи? Этим я не занимался, но по аналогичном опыту в Турбо Паскале могу посоветовать:
1. Строку включения таймера вынести за пределы цикла.
2. Всё-таки использовать Sleep, но в цикле, например, перед ClearDevice
Вадим Мошев вне форума Ответить с цитированием
Старый 02.05.2011, 21:24   #3
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

Оба варианта безрезультатно(( Жалко долго мучаюсь, инет весь обшарила, там в основном только две этих темы: Sleep и таймер. Не помогает(
Код:
  k:=3;
  with Form1 do
    // Timer1.Enabled:=true;
    while k < (Image1.Width - 400) do
    begin
      Sleep(100);
      ClearDevice;
      Transform.Translation(3,0);
      // Timer1.Enabled:=true;
      DrawNave;
      DrawZenit;
      k:=k + 3;
      // Timer1.Enabled:=false;
    end;
А тема - анимация в Delphi (корабль плывет и стреляет из пушки по самолету).
pupilMartyr вне форума Ответить с цитированием
Старый 02.05.2011, 21:32   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Так, подождите...

А что если весь этот код записать в процедуру обработки таймера, которая вызывается каждый раз при истечении заданного интервала?

Поместите этот код туда (тогда никаких Sleep вам не надо будет), а при выходе из цикла (я так полагаю, это завершение анимации?) пишите Timer1.Enabled:=false
Вадим Мошев вне форума Ответить с цитированием
Старый 02.05.2011, 22:08   #5
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

Уже лучше, теперь сначала выводится исходное изображение, потом положенная задержка и финальное изображение)
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Form1.CombatActions;
end;
CombatActions - это и есть процедура выше.
pupilMartyr вне форума Ответить с цитированием
Старый 02.05.2011, 22:28   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Мне ещё кажется, что дело в том, что
Код:
Transform.Translation(3,0);
Что (какие параметры) этот метод принимает в качестве параметров? Может там не следует использовать константы, а вычисляемые выражения?
Всё-таки, очень мне кажется, что проблема здесь..............
Вадим Мошев вне форума Ответить с цитированием
Старый 02.05.2011, 22:41   #7
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Вообще-то очень похоже на гадание! к - локальная переменная? Если да, то зачем? Зачем весь Ваш цикл? Если включаете таймер, то в обработчике таймера всегда:
сначала отключаете таймер, что-то делаете, если необходимо - снова включаете таймер на выходе из обработчика и ждёте следующего события OnTimer.
ReportCube вне форума Ответить с цитированием
Старый 02.05.2011, 23:33   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Кстати, да, действительно, цикл ни к чему. Просто при наступлении определённого условия надо выключить таймер: Timer1.Enabled:=false;
Вадим Мошев вне форума Ответить с цитированием
Старый 03.05.2011, 21:27   #9
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

Код метода Translation:
Код:
procedure TAfins.Translation(dx,dy:integer);
var a:TCd;
begin
     a[1,1]:=1;  a[1,2]:=0;  a[1,3]:=0;
     a[2,1]:=0;  a[2,2]:=1;  a[2,3]:=0;
     a[3,1]:=dx; a[3,2]:=dy; a[3,3]:=1;
     MulMatr(a);
end;
Это просто дисциплина "Компьютерная графика", тема - преобразования на плоскости. Формируется матрица преобразования (Translation - это перенос на вектор dx, dy), и потом каждая координата перемещаемого тела на эту матрицу умножается, тем самым получаются новые координаты и.т.д. Но это не важно. Уверяю, дело не в этом. Потому что все подобные процедуры проверялись в обработчике Form1.FormKeyPress (это была другая прога), там этими процедурами управляла с клавы.
Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  ClearDevice;
  Case Key of
  'd': begin
         Transform.Translation(5,0); x:=x+5
       end;
  'a': begin
         Transform.Translation(-5,0); x:=x-5
       end;
  'w': begin
         Transform.Translation(0,-5); y:=y-5
       end;
  's': begin
         Transform.Translation(0,5); y:=y+5
       end;
Конечно, если просто анимация, я бы не заморачивалась,а так - обязательно нужно эти преобразования использовать.
А насчет k - это просто параметр цикла, мне же нужно как то определить, что достигнута правая граница формы (Ширина - длина корабля) и увеличиваю на 3 типо шаг 3, постоянно сдвигает фигуру на вектор (3,0) вправо.

С таймером сейчас попробую без цикла)

Последний раз редактировалось pupilMartyr; 03.05.2011 в 21:30.
pupilMartyr вне форума Ответить с цитированием
Старый 03.05.2011, 21:57   #10
pupilMartyr
Пользователь
 
Аватар для pupilMartyr
 
Регистрация: 02.05.2011
Сообщений: 45
По умолчанию

Супер! Спасибо большое!
Помогло с таймером!
pupilMartyr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать скрипт вставки изображения!!!! BAN_D_IT Помощь студентам 2 05.10.2010 23:01
Как заменить sleep в потоке? чтобы получить задержку 5 мили Dasverd2010 Общие вопросы Delphi 13 07.09.2010 14:29
как сделать паузу (или задержку) в цыкле : с# Natok Помощь студентам 7 30.05.2009 12:55
Как организовать задержку выполнения?? Kenifer Общие вопросы Delphi 12 03.09.2007 21:56