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

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

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

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

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

textual
Листинг программы
uses
  GraphABC, ABCObjects;
 
var
  buton: RectangleABC;
  
  C1, C2: ContainerABC;
  y01, y02, t, q: integer;
  x1, x2, x01, x02, v1, v2 : real;
 
procedure MyMouseDown(x, y, mb: integer);
begin
  var ob := ObjectUnderPoint(x, y);
  if (ob <> nil) and (ob is RectangleABC) then  begin
    if Q=0 then begin
      Q:=1; buton.Text := 'Продолжить!';
    end
    else begin
      Q:=0; buton.Text := 'Стоп!';
    end;
    
  end;
end;
    /// Рисует точку с координатами х,у, радиусом r, подписывает
    /// ее сверху строчкой S,и присваевает ее контейнеру С1.
procedure po(S: string; x, y, r: integer; var C1: ContainerABC);
 
var
  A: TextABC;
  c: CircleABC;
begin
  c1 := new ContainerABC(x, y);
  A := new TextABC(0, 10, 14, S);
  c := new CircleABC(5, 30, r, clBlue);
  C1.Add(A);
  C1.Add(C);
end;
 
procedure setka(x, h: integer);
var
  h1: integer;
begin
  SetPenColor(clCadetBlue);
  //Горизонтальные линии
  while h1 < WindowHeight do 
  begin
    h1 += h;                         
    Line(0, -20 + h1, GraphABC.WindowWidth, -20 + h1);
  end;
  h1 := 0;
  // Вертикальные линии
  while h1 < WindowWidth do 
  begin
    h1 += h;                      
    Line(h1, 0, h1, GraphABC.WindowHeight);
    TextOut(h1, x + 5, h1);
  end;
  
  SetPenWidth(3);
  Line(0, x, GraphABC.WindowWidth, x); // жирная линия
end;
 
begin
  SetWindowSize(1200, 600);
  SetWindowPos(0, 0);
  setka(180, 100);
  x01 := 10;
  x02 := 1100;
  y01 := 150;
  y02 := 150;
  v1 := 2/10;
  v2 := -4/10;
  x1 := x01;
  x2 := x02;
  po('A', round(x01), y01, 5, c1);
  po('B', round(x02), y02, 5, c2);
  buton := new RectangleABC(500, 500, 300, 50, clAzure);
  buton.Text := 'Стоп!';
  q:=0;
  OnMouseDown := MyMouseDown;
  
  while x1 < x2 do 
  begin
    if Q = 0 then begin
      t += 1;
      x1 := x01 + v1 * t; //Формула расчета координаты автомобиля 1.
      x2 := x02 + v2 * t; //Формула расчета координаты автомобиля 2.
      C1.MoveTo(round(x1), y01);
      C2.MoveTo(round(x2), y02);
    end;  
    Sleep(10);
  end;
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