Tutorials

Уроки Andorra 2D
Часть 1 – Инициализация Andorra 2D

Что такое Andorra 2D?
Andorra 2D – это графический движок для Delphi, Kylix и Freepascal/Lazarus. 2D-движок используется для быстрой прорисовки графики на экране, поэтому может использоваться для разработки игр. К тому же, он позволяет создавать эффекты, которые сложно реализовать, используя стандартную графическую систему в Windows/Linux. Andorra 2D базируется на следующих возможностях:

  • Использование нескольких графических интерфейсов – поддерживается как DirectX,так и OpenGL
  • Совместимость с DelphiX - "старые" программы, которые были сделаны при помощи DelphiX могут быть конвертированы в Andorra 2D без проблем
  • 3D-ускорение – все графические операции обрабатываются, используя аппаратный 3D-ускоритель, что значительно повышает производительность
  • Спрайтовый движок - Andorra 2D включает мощный движок для спрайтов. Это упрощает создание игр.
  • Холст (Canvas) - Andorra 2D создаёт собственный улучшенный холст (canvas), базированный на холсте Delphi


Дальнейшая информация доступна на сайте Andorra: http://andorra.sf.net

Скачивание и установка

Шаг 1: Скачать
Последнюю версию движка Andorra 2D можно скачать на сайте, в категории "Downloads". Ещё там можно найти список всех совместимых версий с Delphi / Lazarus.

Шаг 2: Скопировать в папку Delphi
Скопируйте папку "src" с библиотеками в папку Delphi, например в “C:\Program Files\Borland\BDS\4.0\lib\”. Переименуйте папку "src" в "Andorra" или любое другое название.

Шаг 3: Добавить библиотеки
В Delphi/Lazarus, добавьте новый путь к библиотекам Andorra 2D (обычно настройки находятся в меню "Tools"->"Options"->"Library Paths").

Andorra 2D готова к использованию!

Относительно библиотек: примеры в пакете Andorra 2D содержат заранее скомпилированные библиотеки (например, AndorraDX93D.dll, и др.). Они были сделаны при помощи Turbo Delphi Explorer. Если вы будете использовать их с другими версиями Delphi, могут возникнуть ошибки несовместимости. Чтобы их предотвратить, просто перекомпилируйте библиотеки заново.

Юниты
Если вы ищите обзор всех юнитов Andorra 2D, почитайте список тут:
http://andorra.sourceforge.net/docs/

Инициализация Andorra 2D

Подготовка...
Теперь, когда вы установили Andorra 2D, пришло время её запустить. :)
Создайте новое VCL-Form Application в Delphi. Сохраните проект и скопируйте в папку проекта все необходимые библиотеки Andorra.
Теперь следует добавить необходимые для работы юниты в блок uses:

  • AdDraws: ядро Andorra 2D
  • AdClasses: содержит типы и классы, вспомогательные функции и ещё много полезного))
  • AdTypes: содержит дополнительные типы и классы

Ваш блок «uses» должен выглядеть примерно так:

Delphi-Code:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AdDraws, AdClasses, AdTypes;

Теперь давайте объявим объект TAdDraw. TAdDraw – это ядро Andorra 2D, которое запускает и останавливает графический движок и используется для рисования на холсте.
Используйте следующий код в public часть объявления формы:

Delphi-Code:
AdDraw:TAdDraw;

Теперь необходимо создать событие формы OnFormCreate и вставить следующий код:

Delphi-Code:
AdDraw := TAdDraw.Create(self);

Этот код создаёт новый объект TAdDraw. "self" означает, что родителем объекта является форма, поэтому вся графика будет рисоваться прямо на холсте формы.

После того, как вы создали объект, его нужно уничтожить, после завершения работы программы. Создайте событие "OnDestroy" и поместите туда следующий код:

Delphi-Code:
AdDraw.Free;

Это остановит движок и освободит память.

Теперь давайте вернёмся назад к инициализации. Вы должны подключить к движку графический интерфейс DirectX или OpenGL. Сделать это очень просто, объекту «AdDraw», который мы уже создали необходимо присвоить значение свойства «DllName» на имя файла библиотеки. Плагин DirectX называется "AndorraDX93D.dll", а OpenGL – "AndorraOGL.dll". В будущем, возможно, будут доступны и другие интерфейсы.

Добавьте следующий код в событие «OnCreate»:

Delphi-Code:
AdDraw.DllName := 'AndorraDX93D.dll';

Библиотека загрузиться автоматически, когда это потребуется!


Запуск
Чтобы запустить Andorra 2D, надо вызвать функцию "Initialize" объекта AdDraw. Если запуск прошёл успешно, функция вернёт значение "true", иначе будет выведено сообщение об ошибке и программа завершит работу.
Добавьте такую строку в процедуру OnCreate:

Delphi-Code:
if AdDraw.Initialize then
begin
  // Скоро мы здесь продолжим…
end
else
begin
  ShowMessage('Error while initializing Andorra 2D. Try to use another display'+
              'mode or use another video adapter.');
  halt; //<-- Полностью выключает программу
end;

Первые шаги сделаны. Если программа скомпилировалась и запустилась, то всё было сделано правильно. Но почему же на экране ничего не видно?..

Да, снова чёрное окошко.
Давайте немножко подумаем.
Играм требуется обновлять экран много раз в секунду, часто это делается примерно так (псевдо-код):

Delphi-Code:
ЦИКЛ
  делаем_вычисления;
  обновляем_экран;
  ЕСЛИ НажатаEsc ТО выходим:= true;
ПОКА НЕ выходим;
 

К сожалению, такой метод загружает процессор на 100% (не относится к ноутбукам). К тому же, такая игра будет работать на разной скорости при разных компьютерах, а это не очень хорошо.
Второй метод - использовать таймер TTimer. Но такой метод тоже не идеальный, потому, что у событий таймера низкий приоритет процессора и его события могут обрабатываться максимум 50 раз в секунду.

Несмотря на это, мы обратим внимание на первый метод. Вы можете спросить, куда же поместить цикл в VCL-Application? Ответ очевиден: никуда :). Каждая программа имеет свой внутренний цикл, примерно такой:

Delphi-Code:
while not Application.Terminated do
begin
  Application.ProcessMessages;
  if Done = false then Application.OnIdle; // не совсем так, но это легче понять)
end;


Во время каждого повтора вызывается процедура "OnIdle" и мы можем использовать её в нашем коде.

Добавьте это в public-часть объявления формы:

Delphi-Code:
procedure Idle(Sender:TObject; var Done:boolean);

И теперь мы добавим следующий код:

Delphi-Code:
procedure TForm1.Idle(Sender: TObject; var Done: boolean);
begin
  if AdDraw.CanDraw then // Продолжать только, если возможно рисовать.
  begin
    // Вскоре мы здесь продолжим…
  end;
 
  Done := false; // Это очень важно, иначе функция не будет вызыватся при каждом повторе.
end;

Теперь в событии "OnCreate", в строке, где написано «// Скоро мы здесь продолжим…», напишем:

Delphi-Code:
Application.OnIdle := Idle; 

Это создаст ссылку события "OnIdle" на созданную нами функцию. Теперь эта функция главная в нашей игре. Здесь будут производиться все вычисления и рисование. Поэтому добавим такой код в функции OnIdle:

Delphi-Code:
AdDraw.ClearSurface(clBlack); // Закрашивает поверхность чёрным

AdDraw.BeginScene;
// Здесь в дальнейшем будут происходить все операции с графикой
AdDraw.EndScene;

AdDraw.Flip; // Отображает результат на экране

Ещё одна вещь по поводу AdDraw.Flip: возможно вы замечали, что когда вы рисуете на холсте Delphi, то она «мерцает». Но в Andorra 2D используется специальную уловку, которая исключает это. Используется два холста: пока на экране показывается один, прорисовка следующего кадра производится на другом. Когда прорисовка закончилась, на экране показывается первый, а рисуем уже на втором. Замену производит процедура AdDraw.Flip.Такая концепция называется двойной буферизацией (Double Buffering). Если вы хотите узнать больше, по этому поводу есть статья в Википедии.

Вернёмся в Delphi: запустите программу. Если всё прошло успешно, вы увидите чёрный экран. Поздравляем!

Исходный код
К заключению, конечный код нашей программы:

Delphi-Code:
unit Form1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AdDraws, AdClasses, AdTypes;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    AdDraw:TAdDraw;
    procedure Idle(Sender:TObject;var Done:boolean);
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AdDraw := TAdDraw.Create(self);
  AdDraw.DllName := 'AndorraDX93D.dll';
  if AdDraw.Initialize then
  begin
    Application.OnIdle := Idle;
  end
  else
  begin
    ShowMessage('Error while initializing Andorra 2D. Try to use another display'+
                'mode or another video adapter.');
    halt;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  AdDraw.Free;
end;

procedure TForm1.Idle(Sender: TObject; var Done: boolean);
begin
  if AdDraw.CanDraw then
  begin
    AdDraw.ClearSurface(clBlack);

    AdDraw.BeginScene;
    // Ваш код тут
    AdDraw.EndScene;
   
    AdDraw.Flip;
  end;
  Done := false;
end;

end.

Заключение
Первые шаги к рисованию в 2D графики, используя аппаратный 3D-ускоритель завершены. Но, если быть честным, для того, чтобы закрасить фон чёрным, не нужна ни какая Andorra. Поэтому, следующие уроки будут посвящены таким темам:

  • Как нарисовать картинку
  • Как передвигать изображения с постоянной скоростью
  • Как рисовать в полноэкранном режиме

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

Копирайт и лицензия
(c) автор Andreas Stöckel, Январь 2008
(c) русский перевод: Фадин Александр, Июнь 2009 [sania]at[inbox]dot[lv]

Этот урок выпускается под свободной лицензией документации GNU.


This page was generated with the help of the following PHP-Scripts: GeSHi a free PHP Syntax highlighter and StringParser_BBCode a free BBCode Parser.