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


ОПИСАНИЕ

PERFECT ENGINE.PAS
          класс TCamera
          класс TPerfectEngine

peRENDER_CANVAS.PAS
          класс TJPEGBitmap
peRENDER_OPENGL.PAS

peROUTINE.PAS

SaiLight@mail.ru   

vk.com/sailight

{nosearch}Здравствуйте! На данном сайте команда Perfect Light рада представить вам свою разработку - графический движок Perfect Engine, а в текущей статье будут описаны его основные особенности. Perfect Engine - это простой движок, написанный на Delphi (ООП) и распространяемый с открытым исходным кодом. Ориентирован, в первую очередь, на обучение начинающих программистов, но вполне подойдет и более опытным разработчикам в качестве инструмента, помогающего значительно облегчить и ускорить процесс разработки графических приложений.

 

Со структурой движка вы можете ознакомиться в меню выше, там же - и получить основную информацию по каждой из его функций.

ПРОСТОТА:

Основная идея Perfect Engine - в полной независимости от конкретной библиотеки вывода (рендера). Движок берет на себя все предварительные расчеты в то время, как рендер, идущий в комплекте в виде отдельного модуля, занимается лишь выводом финального изображения в память и на экран.

 

Быстрый старт при работе с движком - это всего 2 строки, которые вам необходимо ввести, чтобы на экране начали появляться необходимые вам объекты:

 

vEngine := peRenderInitialize(Handle, Width, Height);
vEngine.onDraw := pDraw;

 

Функция peRenderInitialize(), входящая в состав каждого из имеющихся рендеров, создает и возвращает объект движка (TPerfectEngine) и назначает ему для вывода все имеющиеся внутри себя функции. За счет этого и достигается независимость движка от рендера - используя только назначенные рендером функции, движок пользуется предоставленными ему возможностями и не заботится о том, как они устроены.

 

Таким образом, практически идентичный код программы может выдавать два совершенно разных изображения на двух разных рендерах, - используя все возможности видеокарты на OpenGL-рендере или же ограничиваясь возможностями GDI-вывода на WinAPI, а не поддерживаемые рендером функции будут просто игнорироваться...

 

Вторая же строка в представленном примере просто переназначает событие вывода кадра на указанную процедуру, где и вызываются необходимые вам функции вывода:

 

Procedure pDraw();
begin
vEngine.pDrawRectangle(X, Y, vWidth, vHeight);
vEngine.pDrawFigure(X, Y, R, vCount, vAngle);
end;

УДОБСТВО:

Движок поддерживает множество удобных для использования функций и классов, а его структура проработана специально с учетом удобства конечного пользователя. Зачастую это достигается длинными и неудобными в использовании функциями рендера, впрочем, конечного пользователя эти ограничения никак не касаются. Но удобство Perfect Engine не ограничивается лишь возможностью быстрого старта - это, прежде всего, и некоторый набор дополнительных функций, значительно упрощающих разработку графических приложений с его использованием:

 

- Класс TCamera

Простая в использовании реализация камеры, для включения которой необходимо лишь назначить True соответствующему свойству движка. Управляется свойством Camera и поддерживает некоторую функциональность, показанную в демонстрационных примерах движка. В данный момент умеет плавно или резко перемещаться к указанной цели и покачиваться с заданной амплитудой.

 

- Хранилище текстур

Каждая текстура, загруженная в память с использованием соответствующей функции, помещается в некоторый массив - хранилище текстур, и автоматически удаляется оттуда при необходимости. Доступ к массиву осуществляется свойством Texture[i] и позволяет получить все необходимые данные о соответствующей текстуре - от ее размера до имени и количества кадров анимации.

 

- Поддержка анимации

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

 

- Встроенный таймер

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

 

- Любые шрифты

Нам порою трудно представить себе реализацию программы в Delphi с использованием нестандартных шрифтов, отсутствующих в папке Fonts операционной системы. В OpenGL для этого зачастую заранее создаются спрайты - большие изображения, хранящие в себе все символы шрифта в определенном разрешении.

 

Perfect Engine заботится и об этом: вы можете загрузить и использовать любой шрифт в формате .ttf, хранящийся в папке с программой, и движок автоматически начнет работу с ним. Для OpenGL же это означает автоматическую генерацию необходимых шрифтовых текстур прямо в памяти!

 

- Дополнительные утилиты

Для хранения данных о цвете движок использует собственный формат TAlphaColor, где в четырехбайтовом числовом значении хранятся RGBA-параметры цвета. Упрощая задачу выбора цвета, мы разработали удобную цветовую палитру Perfect Palette, входящую в набор вспомогательных утилит движка.

 


НЕЗАВИСИМОСТЬ:

Как уже было сказано выше, движок использует одни и те же функции для вывода графики посредством любого рендера. Вы можете рисовать через GDI (peRender_Canvas.pas), выводить графику в чужое окно или на рабочий стол или использовать видеокарту (peRender_OpenGL.pas) - при замене рендера код программы менять не понадобится. OpenGL подключится так же быстро, как создадутся битмапы в GDI-рендере,  и вместо 15-20 строк назначения формата пикселя в OpenGL вы будете использовать все ту же функцию peRenderInitialize(), а все остальное движок сделает за вас автоматически!

 

С появлением рендера на OpenGL (Perfect Engine 2.0)  в вашем распоряжении оказывается, также, удобный инструмент выбора рендера при старте программы. Как это работает - вы можете посмотреть в демо-реализации движка - игре Crown, размещенной на нашем сайте.

ЗАКЛЮЧЕНИЕ:

Подводя итог всему вышесказанному, хотелось бы заметить, что изучение простой и удобной структуры Perfect Engine может в значительной степени помочь новичкам в программировании легко разобраться в устройстве графических движков, структурировании, а также, быстро подойти к созданию собственного игрового проекта. Движок пригодится и более опытным программистам в качестве вспомогательного инструмента для ускорения разработки приложений, требующих удобного и быстрого вывода графики.

 

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

 

А на данном сайте вы можете сообщить нам обо всех ошибках и недработках в Perfect Engine и получить соответствующую техническую поддержку. Если же у вас есть готовые проекты, использующие наш движок - свяжитесь с нами, и мы с радостью поделимся ими здесь. А лучшие проекты смогут появиться на главной странице данного сайта!

ПРИМЕР:

Ну и, напоследок, хотелось бы приложить к данной статье простейший пример использования движка, где всего несколько строк кода позволят нам вывести анимацию из заранее приготовленного спрайта:

 

uses ..., PerfectEngine, peRender_Canvas;

const  PL = 'Perfect Light Programming Project';

var

...
vEngine: TPerfectEngine;//Объект движка
vSpriteNum: Integer;//Номер изображения в массиве
vFrameNum: Integer;//Номер кадра анимации

//Событие вывода кадра
Procedure pDraw();

begin

vEngine.pDrawFrame(vSpriteNum, vFrameNum, 250, 175, 128, 128, True);
vEngine.pTextOut(PL, 5, 5, 18, $fff3cc77);
Inc(vFrameNum);
if (vFrameNum > vEngine.Texture[vSpriteNum].FramesCount - 1) then

vFrameNum := 0;

end;
//Создание формы
procedure TfrmMain.FormCreate(Sender: TObject);
begin

vEngine := peRenderInitialize(Handle, ClientWidth, ClientHeight);
vSpriteNum := vEngine.fLoadTexture('Sprite.jpg', False, 128);
vEngine.pBindFont('Palatino Linotype');

vEngine.TimerInterval := 50;
vEngine.onDraw := pDraw;

end;
//Закрытие формы
procedure TfrmMain.FormDestroy(Sender: TObject);

begin

peRenderDestroy();

end;

 

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

 

 

Perfect Light Design Project, 2015