Как сделать паузу в анимации? - 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.
Объяснение кода листинга программы
- Объявлены переменные и константы:
- buton (объект типа RectangleABC)
- C1, C2 (контейнеры типа ContainerABC)
- y01, y02, t, q (целые числа)
- x1, x2, x01, x02, v1, v2 (действительные числа)
- Определена процедура MyMouseDown, которая реагирует на события мыши. Если нажата кнопка мыши и объект под курсором является прямоугольником, то меняется текст кнопки на
Продолжить!
илиСтоп!
в зависимости от значения переменной Q. - Определена процедура po, которая рисует точку с заданными координатами, подписью и радиусом, и добавляет ее в контейнер C1.
- Определена процедура setka, которая рисует горизонтальные и вертикальные линии на графике, а также жирную линию по оси x.
- В основной части программы устанавливаются размеры окна и позиция, после чего выполняется функция setka.
- Задаются начальные значения переменных: x01, x02, y01, y02, v1, v2, t, q.
- Создаются объекты C1 и C2, и на них отображаются точки A и B соответственно.
- Создается объект buton и устанавливается его текст в
Стоп!
. - Переменная q устанавливается в 0.
- Устанавливается обработчик события MyMouseDown для обработчика событий мыши.
- В цикле while выполняется анимация. Если переменная Q равна 0, то выполняется блок кода, который обновляет координаты и перемещает объекты C1 и C2. После этого выполняется задержка в 10 миллисекунд.
- Программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д