material

Perfect Engine

Теги: Программирование, Библиотеки, Delphi
Графический движок Perfect Engine

Идея создания простого графического движка на Delphi пришла совершенно внезапно, и не было какой-то конкретной цели по реализации конкурентоспособного продукта, но была идея сделать простую для понимания и, между тем, функциональную объектно-ориентированную «графическую библиотеку», способную быстро реализовать рутинные действия по выводу на экран простейшей графики.

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

Самая первая версия движка была написана за пару вечеров на даче и имела другое наименование: «Perfect Canvas». Тогда движок умел работать только с GDI-графикой и еще не был отвязан от рендера. В дальнейшем проект был в значительной степени переосмыслен, и главной его особенностью стала полная независимость от используемого рендера: отныне движок мог использовать рендер при помощи любой графической библиотеки от простого GDI до OpenGL или DirectX. Эта возможность хорошо показана в логической игре Crown, также, написанной с использованием Perfect Engine.

Актуальная на данный момент версия движка включает в себя два рендера: GDI и простой OpenGL, использующий для вывода устаревшие и медленные функции glBegin/glEnd. Однако, уже сейчас готовится к выходу Perfect Engine 3 с переосмысленной структурой и, что самое главное, - новым рендером на OpenGL ES от SpectreZ, использующим для вывода современные возможности видеокарты!

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

1 из 3: perfectengine2.zip
Скачать размер: 458kb

Исходные файлы версии Perfect Engine 2. Архив включает в себя код движка и дополнительных модулей, а также, файлы рендеров на GDI и OpenGL и стороннюю библиотеку pngImage, необходимую для запуска движка.

2 из 3: perfectengine2_demo.zip
Скачать размер: 1.3mb

Несколько демонстрационных проектов, написанных с использованием Perfect Engine 2. Среди них можно встретить и логическую игру Crown, демонстрирующую возможность использования разных рендеров в одном проекте.

3 из 3: perfectutilites.zip
Скачать размер: 489kb

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


Общие сведения

Perfect Engine - это графическая надстройка, состоящая из двух основных частей: непосредственно движка и набора рендеров для него. Актуальная на данный момент (август 2017) версия движка - Perfect Engine 2, поддерживающая все версии Delphi, начиная с 7. Планирующееся обновление до Perfect Engine 3, однако, будет работать только на новых версиях Delphi, предположительно, с 2010 версии.

Ниже представлен список основных классов и дополнительных модулей движка:

  • TPerfectEngine - основной класс движка. Реализует высокоуровневую работу с модулями рендеров и выполняет все необходимые предварительные расчеты. Программный интерфейс класса, при этом, направлен исключительно на удобство и простоту работы с ним, реализуя простые методы для наиболее часто используемых действий.
  • TCamera - дополнительный класс, описывающий работу с камерой как с простым объектом, а также, некоторые эффекты на ее основе, например, плавное перемещение и дрожание с заданной амплитудой.
  • peRender_Canvas/peRender_OpenGL/... - подключаемые рендеры. По некоторым причинам имеют фнкциональную, не объектно-ориентированную, структуру. Содержат в себе набор низкоуровневых действий, вызываемых непосредственно движком и направленных на работу с той или иной графической библиотекой и никак не ориентированные на работу с пользователем.

Для начала работы с движком не надо выполнять никаких сложных действий - достаточно добавить основной модуль движка и модуль требуемого рендера в секцию uses и написать всего 2 строки в onCreate формы (ниже представлен код самой новой на данный момент версии движка):

peRenderInitialize(Handle, ClientWidth, ClientHeight);
vEngine.onDraw := pDraw;

Этот код вызывает функцию инициализации рендера, получающую на вход параметр handle, а также, ширину и высоту области вывода и определяет пользовательскую процедуру, обрабатывающую вывод каждого кадра (в этой процедуре и производится весь вывод). После запуска программы область вывода, имеющая дескриптор handle, окрасится установленным фоновым цветом (по умолчанию - черный) - это значит, что движок работает и уже производит вывод графики.

В самом деле, довольно быстрый старт...

Работа с камерой, также, максимально упрощена - в основном, она сводится к использованию свойства isUseCamera, определяющего, активна ли камера для выводимого объекта или нет. Все остальные расчеты воздействия камеры движок берет на себя.

Некоторые положительные моменты

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

  • Работа с png-изображениями. Движок использует стороннюю библиотеку pngImage для загрузки png-изображений в память, а соответственно, и рендер на OpenGL позволяет свободно загружать и использовать такие изображения.
  • Использование любых шрифтов. Perfect Engine позволяет как использовать втроенные в систему шрифты, так и загружать нестандартные шрифты, просто положив их в папку с программой. Притом, система обработки шрифтов на OpenGL позволяет выводить на экран текст, сохраняющий четкость при любых размерах. Новый рендер на OpenGL ES, к тому же, использует современные технологии вывода, что позволяет значительно ускорить вывод текстовых надписей.
  • Удобная анимация. Движок имеет встроенный механизм работы со спрайтовой анимацией, максимально удобный для пользователя. При загрузке такого изображения достаточно просто указать размер кадра (на данный момент поддерживаются только квадратные кадры), и в дальнейшем, при использовании соответствующей функции вывода с указанием номера выводимого кадра, движок сам рассчитает и возьмет необходимую область изображения.
  • Удобная работа с камерой. В самом деле, одно простое свойство движка - isUseCamera - позволяет включить или отключить использование камеры для всех выводимых в дальнейшем объектов. Те объекты, для которых оно включено, рисуются со смещением на позицию виртуальной камеры в игровом мире, остальные же - в заданных позициях на экране. Также, на данный момент камера имеет удобную функцию, вызывающую эффект дрожания на заданное время и с заданной амплитудой.
  • Оптимизированный вывод. Движок сам заботится об оптимизациях вывода, таких как, например, отсечение не попадающих в область вывода объектов, снимая заботу об этом с конечного пользователя.
  • Расширенные параметры вывода. Все параметры вывода для повышения удобства разделены на две категории: «Основные» и «Расширенные». Основные параметры передаются при каждом вызове функции вывода, тогда как расширенные задаются дополнительной функцией и действуют в течение одного последующего вывода, а затем автоматически обнуляются. Практика показала, что в большинстве случаев такой подход вполне себя оправдывает.
  • Система графических примитивов. Удобная система вывода графических примитивов позволяет рисовать все наиболее часто используемые фигуры - от простых точек и линий до замкнутых многоугольников с заданными радиусом и количеством углов, а также, полигонов. Ко всему прочему, присутствует возможность заливки фигуры с использованием разных стилей и настройки ее контура.
автор: SaiLight работа над проектом: с 2015 года (пока не окончена)

Связанные проекты:

выложено уже 20 проектов из 124 созданных команда Perfect Light, 2017 год