2. Основные изменения
Вся структура движка полностью изменилась – теперь нету никаких компонентов,
и все настройки приходится выставлять вручную, при создании объектов.
Теперь у вас есть набор глобальных переменных, которые отвечают за
некоторые компоненты. Например, Devices содержит в себе ссылки на все
доступные устройства, а также методы для инициализации новых. Canvas и
Images содержатся в самом устройстве, т.е. «все в одном».
Кстати, новый Asphyre работает только на BDS2006 или выше:
это нужно из-за необходимости в некоторых фишках нового Delphi.
Например, class operator: благодаря этой замечательной возможности,
можно описывать операторы (сложение, вычитание, делении и т.д.) для
записей. Т.е. теперь, чтобы сложить два TPoint2 не нужно складывать
каждую координату в отдельности.
Наиболее важное добавление, которого всем не хватало, это поддержка нескольких устройств, т.е. можно использовать два экрана, или даже 3. Единственный недостаток
– это то, что изображения, шрифты и т.д. нужно загружать отдельно для
каждого устройства. Кстати теперь можно выводить графику не только на
само окно, но и на другие контролы, например TPanel.
Второе по значимости – менеджер ресурсов. Теперь вся информация о текстурах (спрайты, поверхности, динамические поверхности) и шрифтах хранится в XML-файле.
Теперь для хранения не обязателен ASDb – можно использовать 7z, SQX, а
можно создать свой собственный обработчик архива (некоторые уже сделали
поддержку zip архивов). В XML-файлах также хранится информация о группах,
т.е. каждый спрайт или шрифт относится к своей определенной группе.
Теперь ресурсы не загружаются сразу, при запуске приложения – теперь вы
сначала загружаете информацию о текстурах, а затем подгружаете сами
текстуры по надобности. Благодаря поддержке групп, можно будет легко
выгрузить изображения или шрифты из памяти нужной группы. Очень удобно.
Появилась возможность внедрять свои собственные эффекты смешивания.
Вы указываете обработчик, в котором описываете свои режимы смешивания.
Причем ведь можно не только их выставлять, но и другие параметры
отрисовки, которые содержатся в Direct3D9.
2.1. Мелкие изменения
- Для отрисовки изображения теперь сначала нужно вызвать процедуру UseImage, затем уже TexMap. В UseImage можно указать текстурные координаты в виде четырехугольника. Да-да, вы не ослышались – теперь можно отрисовать любую часть изображения, не только прямоугольную!
- Введена поддержка системных шрифтов – шрифты, которые находятся у пользователя на компьютере.
- В Canvas добавлены новые фигуры для отрисовки: лента и арка.
Еще есть такие параметры как ширина линии и сглаживание ее. Они
используются для тех процедур, которые оканчиваются Ex.
- Изменился формат цвета. Теперь у нас "$AARRGGBB" вместо "$AABBGGRR".
- Была переделана утилита FontTool и создана новая – TextureMaker.
Она создает новую, прооптимизированую текстуру, а также показывает
некоторые параметры, нужные для описания в XML. Единственный
недостаток: нет предпросмотра. Но это пока.
3. Минимальное приложение
Что ж, пришло время написать какое-нибудь приложение на Asphyre!
Надеюсь, у вас уже скачан и установлен движок? Мы создадим этот пример
уже из стандартного, который находится по адресу http://asphyre.afterwarp.net/wiki.
(1) Создаем новый проект и где-нибудь его сохраняем. Подключите следующие модули:
Код на языке Delphi uses ..., AsphyreDevices, AsphyreTimer, AsphyreDef, AsphyreImages, AsphyrePalettes,
AsphyreEffects, MediaImages, CommonUtils, AsphyreCanvas;
(2) Теперь нам нужно создать стандартные обработчики: событие
таймера, настройки устройства и т.д. Добавляйте следующие процедуры в
Form1 в раздел private:
Код на языке Delphi //процедура настройки устройства
procedure DevConfig(Sender: TAsphyreDevice; Tag: TObject;
var Config: TScreenConfig);
//обработчик события таймера
procedure TimerEvent(Sender: TObject);
//обработчик рисования
procedure DevRender(Sender: TAsphyreDevice; Tag: TObject);
Нажмите Ctrl+C для завершения класса. Или можно ввести их вручную, что я не советую :).
Создайте событие создания комнаты. Туда впишите следующий код:
Код на языке Delphi Devices.Count := 1; //кол-во устройств
if (not Devices.Initialize(DevConfig, Self)) then
begin
ShowMessage('Initialization failed.');
Close;
Exit;
end;
//сбор сведений об изображениях (или шрифтах, чего угодно).
//Заметте, что только сведений. Сами изображения не загружаются
ImageGroups.ParseLink('/media.xml');
//эта ф-ия загружает изображение с заданным именем.
//Возвращает индекс нового изображения
Devices[0].Images.ResolveImage('success');
//настройка таймера
with Timer do
begin
Enabled:= True;
OnTimer:= TimerEvent; //событие таймера
MaxFPS:= 4000;
end;
Процедура настройки (DevConfig):
Код на языке Delphi Config.Width := 320; //ширина устройства
Config.Height := 240; //высота
Config.Windowed := True; //в окне или нет
Config.VSync := False; //вертикальная синхр.
Config.BitDepth := bd24bit; //битность
Config.HardwareTL := False;
//идентиф. окна, на котором будет выводится графика
Config.WindowHandle := Self.Handle;
Config.DepthStencil := dsNone;
Переходим к событию таймера:
Код на языке Delphi //запускаем обработчик рисования
Devices[0].Render(DevRender, Self, $FF000000);
Первый параметр - процедура, в которой будет происходить отрисовка.
Второй - объект, к которому относится отрисовка.
Третий - цвет фона.
И последнее, событие рисования:
Код на языке Delphi with Sender.Canvas do
begin
UseImage(Sender.Images[0], 0);
TexMap(pBounds4s(0, 0, 320, 240, 1), cAlpha4(255), fxuBlend);
end;
Существует несколько разновидностей UseImage. В нашем случае мы
указываем нужное изображение и номер кадра. Другие виды рассмотрите
самостоятельно.
(3) Нужно теперь создать сами XML-файлы. Их будет два: media.xml и images.xml. Содержание первого файла:
Код на языке XML <unires>
<!-- перенаправление на другой файл, в котором содержится информ. об изображениях -->
<resource source="/images.xml" />
</unires>
И второго:
Код на языке XML <unires>
<image-group name="/images/base" option="normal">
<image uid="success" type="image">
<format type="A8R8G8B8" miplevels="auto" />
<pattern width="512" height="256" count="1" padx="0" pady="0" />
<textures count="1">
<texture num="0" source="success.jpg" />
</textures>
</image>
</image-group>
</unires>
- В группе image-group в поле name содержится название группы.
- Группой image вы начинаете описание нового изображения.
- В поле uid нужно указывать название изображения, в поле type - его тип. Это может быть image - изображение, surface - поверхность, dynamic - динамическая поверхность.
- В группе format вы указываете настройки изображения для памяти.
- Группа pattern служит для описания кадров: width - ширина, height - высота; count - количество; padx, pady - смещение кадра.
- Группа textures начинает блок описания включаемых текстур. Поле num - номер новой текстуры, source - путь к файлу. Если его записать ввиде "file_name | archive_path", то изображение будет загружаться из архива "archive_path".
Осталось добавить само изображение: success.jpg.
(4) Сохраним это приложение как шаблон. Для этого выберите пункт меню: ProjectAdd to Repository...
4. Заключение
Чтож, как мы видим, Asphyre 4.0 оправдал все надежды. Причем, это
только начало: еще нас ждет продвинутое 3D, gui, Shaders и много еще
чего. Не забывайте просматривать стандартные примеры - оттуда вы
узнаете, как пользоваться архивами, поверхностями и всякими забавными
"штучками". Спасибо, что были с нами, удачи!
|