Главная страница
Навигация по странице:

  • Процедура ClearWindow (color);

  • Redraw; Эта процедура вызовет перерисовку всей картины.Нарисуем сначала четыре окружности.program

  • Задание 1

  • Задание 3.

  • 2. Изменение размера шарика

  • Использование оператора Random в анимации

  • Задача 1.

  • Код к задаче: «Написать программу, в которой окружность «пробегает» по периметру прямоугольника»

  • задачи на движение в паскале. Программа на паскаль, в которой окружность перемещается по экрану


    Скачать 52.4 Kb.
    НазваниеПрограмма на паскаль, в которой окружность перемещается по экрану
    Дата07.03.2022
    Размер52.4 Kb.
    Формат файлаdocx
    Имя файлазадачи на движение в паскале.docx
    ТипПрограмма
    #385442

    Источник: 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копировать

    1. uses graphABC;

    2. var x1,y1,x2,y2,r,x,y:integer;

    3. begin

    4. r:=20;

    5. x1:=r;

    6. y1:=r;

    7. x2:=windowwidth-r;

    8. y2:=windowheight-r;

    9. x:=x1;

    10. y:=y1;

    11. lockdrawing;

    12. while x<=x2 do

    13.  begin

    14.   clearwindow;

    15.   setpencolor(clBlue);

    16.   rectangle(x1,y1,x2,y2);

    17.   setpencolor(clRed);

    18.   circle(x,y,r);

    19.   sleep(50);

    20.   x:=x+5;

    21.   redraw;

    22.  end;

    23. while y<=y2 do

    24.  begin

    25.   clearwindow;

    26.   setpencolor(clBlue);

    27.   rectangle(x1,y1,x2,y2);

    28.   setpencolor(clRed);

    29.   circle(x,y,r);

    30.   sleep(50);

    31.   y:=y+5;

    32.   redraw;

    33.  end;

    34. while x>=x1 do

    35.  begin

    36.   clearwindow;

    37.   setpencolor(clBlue);

    38.   rectangle(x1,y1,x2,y2);

    39.   setpencolor(clRed);

    40.   circle(x,y,r);

    41.   sleep(50);

    42.   x:=x-5;

    43.   redraw;

    44.  end;

    45. while y>=y1 do

    46.  begin

    47.   clearwindow;

    48.   setpencolor(clBlue);

    49.   rectangle(x1,y1,x2,y2);

    50.   setpencolor(clRed);

    51.   circle(x,y,r);

    52.   sleep(50);

    53.   y:=y-5;

    54.   redraw;

    55.  end;

    56. end.


    написать администратору сайта