Учебник по программированию.

Первые шаги. Язык программирования PascalABC.

Предыдущий параграф Назад в содержание Следующий параграф


§32. Обзор классов и модулей PascalABC.NET.

Класс GraphABCWindow.

Когда мы запускаем программу, к которой подключён модуль GraphABC.NET, на экране автоматически появляется виндоусовское окно. Это не что иное, как графический объект, подобный нашим кнопкам и мячам. Имя этого объекта Window. Он создаётся автоматически при запуске программы и выводится на экран. Этот объект принадлежит классу GraphABCWindow. Как и у любого другого класса у него есть свои поля, свойства и методы, о которых можно прочитать в разделе справки: «Стандартные модули -> Модуль GraphABC -> GraphABC: объект графического окна Window».

Для того, что бы обратиться к этим свойствам и методам, так же как и в случае с другими объектами, необходимо написать имя Window и после точки указать имя свойства или метода. Например, в следующей программе мы изменили заголовок окна через свойство Caption:


uses GraphABC;


begin

  Window.Caption:='Привет всем!';

end.


Здесь необходимо добавить, что свойства и методы можно менять и вызывать через процедуры и функции, о которых написано в разделе справки: «Стандартные модули -> Модуль GraphABC -> GraphABC: Подпрограммы для работы с графическим окном».


Класс GraphABCCoordinate.

Объект Coordinate данного класса позволяет менять масштаб, сдвигать и поворачивать координатную сетку окна, в которое мы выводим свои рисунки. Что это значит? Если мы не делали ни каких настроек данного объекта, то, к примеру примеру, масштаб рисования будет один к одному, т.е. если нам нужна линия в 10 пикселей, то рисуя такую линию, мы получим линию в 10 пикселей. Если мы изменим масштаб на два к одному, и нарисуем линию длиной 10 пикселей, то в реальности получим линию в 20 пикселей.

Т.е. если мы, каким либо образом настроим данный объект, то изменится либо масштаб вывода, либо рисунки будут смещены относительно левого верхнего угла, либо всё нарисованное повернётся на определённый угол.

Этот класс находится в модуле GraphABC. О нём достаточно понятно расписано в разделе справки: «Стандартные модули -> Модуль GraphABC -> GraphABC: Объект Coordinate координат графического окна».

Далее простейший пример, в котором с помощью метода Scale (изменение масштаба) объекта Coordinate меняется масштаб вывода:


uses GraphABC;


begin

  DrawRectangle(10,10,100,50);

  Coordinate.Scale:=1.5;//Масштаб 1:1.5

  DrawRectangle(10,10,100,50);

  Coordinate.Scale:=1;//Масштаб 1:1

  DrawRectangle(10,10,100,50);

end.


Примечание: в результате работы программы мы видим 2 прямоугольника, хотя процедура DrawRectangle была вызвана 3 раза. Это потому, что изначально масштаб настроен как один к одному, затем он был изменён. После того, как мы снова сделали масштаб один к одному, прямоугольник был нарисован точно на первом.

Далее ещё один пример, в котором на основе модулей MObjects и MRisunki, создаётся класс TMashinkaPrepyatstviye. Этот класс является почти копией класса TMashinka, только машинка этого класса будет направлена лобовой частью вниз. Т.е. в игре её можно будет использовать в качестве препятствия. Далее код:


uses GraphABC,MObjects,MRisunki;


type TMashinkaPrepyatstviye = class (TMashinka)

       procedure Draw; override;

         begin

           Coordinate.OriginX:=2*x+30;

           Coordinate.OriginY:=2*y+40;

           Coordinate.Angle:=180;

           DrawCar(x,y);

           Coordinate.OriginX:=Round(Coordinate.OriginX/2-30);

           Coordinate.OriginY:=Round(Coordinate.OriginY/2-40);

           Coordinate.Angle:=0;

         end;

     end;


var MasPrep:TMashinkaPrepyatstviye:=new TMashinkaPrepyatstviye(100,10);


begin

end.


Пояснение: свойство Angle поворачивает всю координатную сетку. Соответственно нарисованный объект  не только повернётся, но и сместится с ней со всей. Поэтому, что бы его как бы вернуть обратно, необходимо сместить и всю координатную сетку влево и вниз.


Модуль ABCObjects .

Модуль ABCObjecnts представляет собой библиотеку классов векторных графических объектов. До сих пор мы прописывали методы рисования и стирания объектов вручную, а так же реализовывали движение объектов самостоятельно. При использовании классов данного модуля, всё это будет делаться автоматически.

В данном модуле описан базовый класс ObjectABC и ряд производных от него. В качестве примера приведу использование класса PictureABC, который позволяет выводить на экран рисунки из файла:


uses GraphABC,ABCObjects;


var Kartinka:PictureABC:=new PictureABC(10,10,'Kartinka.jpg');


begin

  Window.Clear(clDimGray);

  Kartinka.dx:=2;

  Kartinka.dy:=2;

  For var i:=1 to 100 do 

    begin

      Kartinka.Move;

      Sleep(200);

    end;

  Kartinka.Destroy; 

end.


В данном примере в качестве параметра в конструктор класса PictureABC передаются координаты и имя файла, в котором содержится рисунок. Для проверки данного примера можете передать имя своего рисунка.


Класс Timer.

Объекты класса Timer предназначены для выполнения определённых действий через равные промежутки времени. Описание данного класса дано в следующем разделе справки: «Стандартные модули -> Модуль Timers».

Простейшим примером использования данного класса может быть программа вывода на экран мигающей надписи:


uses GraphABC,Timers;

const sNadpis = 'Привет всем!';

var Vidimost:boolean:=true;

   

procedure Pr;

begin

  if vidimost then

    begin

      TextOut(100,10,sNadpis);

      vidimost:=false

    end 

   else

    begin

      FillRect(100,10,100+TextWidth(sNadpis),10+TextHeight(sNadpis));

      vidimost:=true

    end;

end;


var time:Timer:=new Timer(400,Pr);


begin

  SetBrushColor(clWhite);

  time.Start;

end.


В примере приведено два рисунка для того, что бы показать, что надпись то появляется, то исчезает.

Если вы будете использовать мигающую надпись в своей программе, то вероятнее всего будет удобнее, если она будет оформлена в виде объекта. Поэтому приведу пример, в котором описан и использован класс TMigNadpis:


uses GraphABC,Timers;


type TMigNadpis = class

       vidimost:boolean:=true;

       x,y:integer;

       sNadpis:string;

       Time:Timer;

       constructor (xx,yy,t:integer;ss:string);

         begin

           sNadpis:=ss;

           x:=xx;

           y:=yy;

           Time:=new Timer(t,Draw);

           Time.Start;

         end;

       procedure Draw;

         begin

           if vidimost then

               begin

                 TextOut(x,y,sNadpis);

                 vidimost:=false

               end 

             else

               begin

                 SetBrushColor(clWhite);

                 FillRect(x,y,x+TextWidth(sNadpis),y+TextHeight(sNadpis));

                 vidimost:=true

               end;

         end;

      end;


var MigNadpis_1:TMigNadpis:=new TMigNadpis(100,20,400,'Привет всем!');

    MigNadpis_2:TMigNadpis:=new TMigNadpis(300,20,300,'Ура!');


begin

end.

В качестве параметров в конструктор класса TMigNadpis передаются координаты, время интервала мигания и текст надписи. Используя этот класс можно создать не одну, а несколько мигающих надписей в любом месте экрана. Так же стоит заметить, что в данном примере надписи мигают независимо друг от друга. По такому же принципу можно организовать анимацию, используя класс MultiPictureABC.


Модуль ABCSprites .

В модуле ABCSprite описан класс SpriteABC, объекты которого являются анимационными рисунками. Данный класс удобно использовать при создании игровых объектов. Пример использования данного класса приводить не буду, т.к. он может получиться достаточно большим. А так же потому, что в нём должны использоваться рисунки из файлов, поэтому проверить работу данного примера вы не сможете.

Находится данная тема в разделе справки: «Стандартные модули -> Модуль ABCSprites». Думаю, вы с ней без труда разберётесь.


В данном параграфе мы произвели обзор готовых модулей и классов, которыми вы можете пользоваться, решая последние задания этого учебника.


Задача.

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

Примечание: решение данной задачи может отнять у вас много времени, тем не менее, решить её надо обязательно, т.к. вы приобретёте знания, которые просто необходимы для решения задач из следующего параграфа. Хочется сделать рекомендацию, сохраните все придуманные вами примеры и дайте им соответствующие имена. Сделать это необходимо потому, что помнить всё невозможно и эти примеры помогут вам оперативно находить нужную информацию.


Решение.

Это задание вы должны выполнить самостоятельно.


Предыдущий параграф Назад в содержание Следующий параграф