Графический движок «Perfect Engine»

Теги: Программирование, Библиотеки, Delphi

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

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

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

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

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

perfectengine2.zip (458kb) Исходные файлы версии Perfect Engine 2 с рендерами (GDI, OpenGL) и дополнительными библиотеками.
perfectengine2_demo.zip (1.3mb) Демонстрационне проекты на движке Perfect Engine 2.
perfectutilites.zip (489kb) Дополнительная утилита «Perfect Palette», для работы с цветом в формате Perfect Engine.

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

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

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

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

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

Код на языке pascal:
peRenderInitialize(Handle, ClientWidth, ClientHeight);
vEngine.onDraw := pDraw;

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

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

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

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

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

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

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

+
Фильтрация по тегам
Выбранные теги отобразятся в этой области...
Найти
Программирование 38, Игры 16, Программы 12, Delphi 29, Библиотеки 15 Веб-разработка 23, Сайты под ключ 7, Дизайн 22, JavaScript 5, PHP 0, Laravel 0, Joomla 2 Графика 30, Обработка фото 6, Логотипы 2, Иллюстрации 7, Рисунки 3, Печатная продукция 2 Видео 11, Трейлеры 1, Анимация 3 Музыка 3, Персонажи 8, Статьи 7, Литература 5, Рассказы 4, Стихи 1, 2D 5, 3D 20, На заказ 10
Используйте среднюю кнопку для быстрого фильтра по тегу...
Календарь проектов
2015 7 , 2016 6 , 2014 3 , 2010 5 , 2011 1 , 2013 2 , 2012 1 , 2009 3 , 2017 3 , 2018 1