Как сделать паузу в анимации? - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Как сделать паузу в анимации?»

textual
Листинг программы
  1. uses
  2.   GraphABC, ABCObjects;
  3.  
  4. var
  5.   buton: RectangleABC;
  6.  
  7.   C1, C2: ContainerABC;
  8.   y01, y02, t, q: integer;
  9.   x1, x2, x01, x02, v1, v2 : real;
  10.  
  11. procedure MyMouseDown(x, y, mb: integer);
  12. begin
  13.   var ob := ObjectUnderPoint(x, y);
  14.   if (ob <> nil) and (ob is RectangleABC) then  begin
  15.     if Q=0 then begin
  16.       Q:=1; buton.Text := 'Продолжить!';
  17.     end
  18.     else begin
  19.       Q:=0; buton.Text := 'Стоп!';
  20.     end;
  21.    
  22.   end;
  23. end;
  24.     /// Рисует точку с координатами х,у, радиусом r, подписывает
  25.     /// ее сверху строчкой S,и присваевает ее контейнеру С1.
  26. procedure po(S: string; x, y, r: integer; var C1: ContainerABC);
  27.  
  28. var
  29.   A: TextABC;
  30.   c: CircleABC;
  31. begin
  32.   c1 := new ContainerABC(x, y);
  33.   A := new TextABC(0, 10, 14, S);
  34.   c := new CircleABC(5, 30, r, clBlue);
  35.   C1.Add(A);
  36.   C1.Add(C);
  37. end;
  38.  
  39. procedure setka(x, h: integer);
  40. var
  41.   h1: integer;
  42. begin
  43.   SetPenColor(clCadetBlue);
  44.   //Горизонтальные линии
  45.   while h1 < WindowHeight do
  46.   begin
  47.     h1 += h;                        
  48.     Line(0, -20 + h1, GraphABC.WindowWidth, -20 + h1);
  49.   end;
  50.   h1 := 0;
  51.   // Вертикальные линии
  52.   while h1 < WindowWidth do
  53.   begin
  54.     h1 += h;                      
  55.     Line(h1, 0, h1, GraphABC.WindowHeight);
  56.     TextOut(h1, x + 5, h1);
  57.   end;
  58.  
  59.   SetPenWidth(3);
  60.   Line(0, x, GraphABC.WindowWidth, x); // жирная линия
  61. end;
  62.  
  63. begin
  64.   SetWindowSize(1200, 600);
  65.   SetWindowPos(0, 0);
  66.   setka(180, 100);
  67.   x01 := 10;
  68.   x02 := 1100;
  69.   y01 := 150;
  70.   y02 := 150;
  71.   v1 := 2/10;
  72.   v2 := -4/10;
  73.   x1 := x01;
  74.   x2 := x02;
  75.   po('A', round(x01), y01, 5, c1);
  76.   po('B', round(x02), y02, 5, c2);
  77.   buton := new RectangleABC(500, 500, 300, 50, clAzure);
  78.   buton.Text := 'Стоп!';
  79.   q:=0;
  80.   OnMouseDown := MyMouseDown;
  81.  
  82.   while x1 < x2 do
  83.   begin
  84.     if Q = 0 then begin
  85.       t += 1;
  86.       x1 := x01 + v1 * t; //Формула расчета координаты автомобиля 1.
  87.       x2 := x02 + v2 * t; //Формула расчета координаты автомобиля 2.
  88.       C1.MoveTo(round(x1), y01);
  89.       C2.MoveTo(round(x2), y02);
  90.     end;  
  91.     Sleep(10);
  92.   end;
  93. end.

Объяснение кода листинга программы

  1. Объявлены переменные и константы:
    • buton (объект типа RectangleABC)
    • C1, C2 (контейнеры типа ContainerABC)
    • y01, y02, t, q (целые числа)
    • x1, x2, x01, x02, v1, v2 (действительные числа)
  2. Определена процедура MyMouseDown, которая реагирует на события мыши. Если нажата кнопка мыши и объект под курсором является прямоугольником, то меняется текст кнопки на Продолжить! или Стоп! в зависимости от значения переменной Q.
  3. Определена процедура po, которая рисует точку с заданными координатами, подписью и радиусом, и добавляет ее в контейнер C1.
  4. Определена процедура setka, которая рисует горизонтальные и вертикальные линии на графике, а также жирную линию по оси x.
  5. В основной части программы устанавливаются размеры окна и позиция, после чего выполняется функция setka.
  6. Задаются начальные значения переменных: x01, x02, y01, y02, v1, v2, t, q.
  7. Создаются объекты C1 и C2, и на них отображаются точки A и B соответственно.
  8. Создается объект buton и устанавливается его текст в Стоп!.
  9. Переменная q устанавливается в 0.
  10. Устанавливается обработчик события MyMouseDown для обработчика событий мыши.
  11. В цикле while выполняется анимация. Если переменная Q равна 0, то выполняется блок кода, который обновляет координаты и перемещает объекты C1 и C2. После этого выполняется задержка в 10 миллисекунд.
  12. Программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут