задачи на движение в паскале. Программа на паскаль, в которой окружность перемещается по экрану
Скачать 52.4 Kb.
|
Источник: https://netigor.ru/kak-sdelat-animatsiyu-v-paskal-avs Простейшая программа на паскаль, в которой окружность перемещается по экрану uses GraphABC; var i,x : integer; begin setWindowSize(500, 500); clearwindow(clBlack); for i:=1 To 100 do begin SetPenColor(clBlack); circle(i,50,20); sleep(10); clearwindow(); end; SetPenColor(clBlack); circle(i,50,20); end. Процедура LockDrawing; Рисование средствами PascalABC происходит очень медленно. Пока оно идет, картинка на экране успевает много раз обновиться. Отсюда мерцание. То есть, мы видим не окончательную картинку, а процесс ее рисования. Окончательную картинку в общем-то не видим — как только она построилась, мы ее тут же стираем и начинаем новый цикл рисования. Для борьбы с этим эффектом придумали двойную буферизацию. Идея в том, чтобы сначала построить картинку в памяти (не выводя на экран), а затем отобразить новый кадр на экране целиком, без промежуточных вариантов, где не хватает половины лучиков. Для этого в начале программы вызываем процедуру LockDrawing. Процедура ClearWindow (color); После каждой прохода по циклу очищает графическое окно указанным цветом, который передается в качестве параметра. После этого все команды рисования будут создавать картинку в памяти (в так называемом вторичном буфере). Непосредственно на экране ничего рисоваться не будет. После того, как очередной кадр анимации полностью отрисован (то есть перед ClearWindow), нужно вызвать процедуру Redraw; Эта процедура вызовет перерисовку всей картины. Нарисуем сначала четыре окружности. program animation; uses GraphABC; begin SetWindowSize(400, 400); //Размерокна //Отрисовка четырех окружностей. Circle (100, 100, 20); Circle (300, 100, 20); Circle (100, 300, 20); Circle (300, 300, 20); end. Получим результат: Второй стадией, будет отрисовка пятой окружности и с помощью вышеуказанных процедур и цикла заставим его двигаться по заданной траектории. program animation; uses GraphABC; var i : integer; begin SetWindowSize(400,400); LockDrawing; //Движение от первой точки до второй for i:=100 to 300 do begin SetBrushColor(clWhite); Circle (100, 100, 20); Circle (300, 100, 20); Circle (100, 300, 20); Circle (300, 300, 20); SetBrushColor(clBlack); Circle (i, 100, 20); RedRaw; ClearWindow(clWhite); end; //Движение от второй точки до третьей for i:=100 to 300 do begin SetBrushColor(clWhite); Circle (100, 100, 20); Circle (300, 100, 20); Circle (100, 300, 20); Circle (300, 300, 20); SetBrushColor(clBlue); Circle (300, i, 20); RedRaw; ClearWindow(clWhite); end; //Движение от третьей точки до четвертой for i:=300 downto 100 do begin SetBrushColor(clWhite); Circle (100, 100, 20); Circle (300, 100, 20); Circle (100, 300, 20); Circle (300, 300, 20); SetBrushColor(clRed); Circle (i, 300, 20); RedRaw; ClearWindow(clWhite); end; //Движение от четвертой точки до первой for i:=300 downto 100 do begin SetBrushColor(clWhite); Circle (100, 100, 20); Circle (300, 100, 20); Circle (100, 300, 20); Circle (300, 300, 20); SetBrushColor(clGreen); Circle (100, i, 20); RedRaw; ClearWindow(clWhite); end; end. Движение шарика Алгоритм движения следующий: пером красного цвета рисуем параметризованную окружность (изменяемые параметры - координаты центра), заливаем круг внутри окружности красным цветом. Делаем задержку. Очищаем экран в цвет фона (т.е. стираем шарик). За счет изменения параметра получаем необходимое смещение шарика. Пример программы, где шарик движется по диагонали. Uses GraphABC; var i:integer; procedure shar(a:integer); var k,m:integer; begin SetPenColor(clRed); Circle(a,a, 50); FloodFill(a,a,clRed ); for k:=1 to 100000 do m:=m+1; ClearWindow(clSilver ); end; begin SetWindowHeight(500); SetWindowWidth(500); ClearWindow(clSilver ); for i:=1 to 500 do shar(i); end. Задание 1. Измените цвет шарика на зеленый, а цвет фона на желтый. Задание 2. Измените программу таким образом, чтобы шарик двигался по горизонтали в центре окна. Задание 3. Измените программу таким образом, чтобы шарик двигался по вертикали в центре окна. Задание 4. Измените программу таким образом, чтобы шарик двигался по второй диагонали сверху вниз. 2. Изменение размера шарика Пример программы рисующей раздувающийся пузырь. Центр пузырика стоит на месте, увеличивается радиус. Uses GraphABC; var i:integer; procedure shar(a:integer); var k,m:integer; begin SetPenColor(clSkyBlue); Circle(250,250, a); FloodFill(250,250,clSilver); for k:=1 to 100000 do m:=m+1; ClearWindow(clSilver ); end; begin SetWindowHeight(500); SetWindowWidth(500); ClearWindow(clSilver ); for i:=1 to 250 do shar(i); end. Задание 1. Измените цвет пузырика и цвет фона. Задание 2. Измените программу таким образом, чтобы пузырик увеличивался и двигался по главной диагонали. Использование оператора Random в анимации Для задания положения, размера или цвета объекта можно использовать генератор случайных чисел. Рассмотрим задачу, в которой случайным является положение точки на экране. Задача 1. Засыпать окно (учитывать изменение размеров) точками. uses GraphABC; var x,y,i:integer; begin for i:=1 to 10000 do begin x:=random(WindowWidth)+1; //WindowWidth - возвращает ширину окна y:= random(WindowHeight)+1; // WindowHeight - возвращает высоту окна SetPixel(x,y,clblack); end; end. Движение шара (без мерцания) uses GraphABC; var I,X,Y,D: integer; begin X:=20; Y:=30; D:=100; LockDrawing; for i:=1 to 500 do begin ClearWindow; SetBrushColor(clGreen); Ellipse(X+I,Y,X+I+D,Y+D); Redraw; Sleep(1); end; end. Столкновение двух шаров ( один шар движется, другой покоится) uses GraphABC; var I,X,Y,D,X1,X2: integer; begin X:=20; Y:=30; D:=70; X1:=350; X2:=500; LockDrawing; for I:=1 to X1-D do // зеленый шар движется, красный стоит на месте begin ClearWindow; SetBrushColor(clGreen); Ellipse(X+I,Y,X+I+D,Y+D); SetBrushColor(clRed); Ellipse(X+X1,Y,X+X1+D,Y+D); Redraw; Sleep(5); end; for I:=X1 to X2 do // зеленый шар стоит на месте, красный шар движется begin ClearWindow; SetBrushColor(clGreen); Ellipse(X+X1-D,Y,X+X1,Y+D); SetBrushColor(clRed); Ellipse(X+I,Y,X+I+D,Y+D); Redraw; Sleep(5); end; end. Код к задаче: «Написать программу, в которой окружность «пробегает» по периметру прямоугольника» Листинг программы Cкопировать uses graphABC; var x1,y1,x2,y2,r,x,y:integer; begin r:=20; x1:=r; y1:=r; x2:=windowwidth-r; y2:=windowheight-r; x:=x1; y:=y1; lockdrawing; while x<=x2 do begin clearwindow; setpencolor(clBlue); rectangle(x1,y1,x2,y2); setpencolor(clRed); circle(x,y,r); sleep(50); x:=x+5; redraw; end; while y<=y2 do begin clearwindow; setpencolor(clBlue); rectangle(x1,y1,x2,y2); setpencolor(clRed); circle(x,y,r); sleep(50); y:=y+5; redraw; end; while x>=x1 do begin clearwindow; setpencolor(clBlue); rectangle(x1,y1,x2,y2); setpencolor(clRed); circle(x,y,r); sleep(50); x:=x-5; redraw; end; while y>=y1 do begin clearwindow; setpencolor(clBlue); rectangle(x1,y1,x2,y2); setpencolor(clRed); circle(x,y,r); sleep(50); y:=y-5; redraw; end; end. |