Как сделать паузу в анимации? - 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 миллисекунд.
- Программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д