02. Пишем движок: Defo Engine - ресурсы и 2D
Автор: crionuke
Фу-х, наконец-то у меня появилось время заняться моим движком. Со времен его первого показа народу много чего добавилось, но сразу скажу, что не изменилось, архитектура системы осталась прежней:]
Как было сказано в прошлой статье, интерфейсы предоставляют доступ к методам и свойствам объектов, а теперь внимание! Эти же объекты надо где-то хранить? Для этого в движке появилась фабрика - IFactory.
С помощью этого интерфейса предоставляется возможность собственноручно создавать экземпляры классов(объектов) всего того,чего тока можно создать c помощью движка:), буд-то текстуры(ITexture), спрайты(ISprite), шрифты(IFont), и т.д.
Пример методов:
function NewTexture:ITexture; function NewFont:IFont, functino NewSprite:ISprite;
Вообще, по-идеи, конечный пользователь, этого не будет делать, это можно будет сделать на более высоком уровне абстракции(все выше перечисленные объекты - высокоуровневые, их можно создавать через IScene). Но всеравно, на высоком уровне это делается через более низкий, именно так я понимаю смысл понятия "гибкая архитектура".
Так же стоит упамянуть, что классы всех ресурсов, и высокоуровневых объектв (шрифтов, спрайтов), вообщем всего, что можно создать в DefoEngine, и объекты, которые будут храниться в фабрике, наследуются от базового класса CFactoryObject, все потомки этого класса, таким образом автоматически получают идентификатор FFactoryID объекта фабрики, который используется уже во многих местах, буд-то IRender или IScene...
Но для функционирования высокоуровневых объектов, шрифтов, спрайтов, нужны ресурсы, которые движок должен получать из вне, к примеру загружать с жесткого диска, этим действом и занимается специальный менеджер - IResManager, на данный момент реализованна только зангрузка текстур, потаму что на данном этапе разроботке не требуется других ресурсов, как только, так сразу:]
IResManager – самый что ни на есть обычный(обычный не значит простой) менеджер ресурсов, работает в связки с IFactory, помимо того, что cледит за тем, что бы ресурсы в памяти не дублировались, а в случае попытки повторной загрузки не загружает, а возвращает ресурс из памяти, он непосредственно создает загружаемые ресурсы в фабрике (ведь для хранения тектуры тоже требуется объект класса CTexture). Например метод LoadTexture(FileName):ITexture, на самом деле делает следующие (аля гибкая архитектура):
//Создает объект текстуры в фабрике tex:=IFactory.NewTexture; //Грузим из файла tex.Load(FileName); //Возвращаем интерфейс на загруженную текстуру, сам объект хранится в фабрике result:=tex;
Так же как и классы объектов фабрики, классы объектов менеджера ресурсов, так же наследуются от специального класса - CResuource (например CTexture). Что же в СResource находится? А вот что: FPath - путь до файла с ресурсом (используется для проверки повторной загрузки), FName - имя ресурса (Используется для получения ресурса, загруженного движком автоматически, например при загрузки сцены, когда пользователь явно не получает интерфейсы на ресурсы)
Ну это все что касается ресурсов.
Теперь умея создавать, загружать и хранить ресурсы, можно преступить к рассмотрению рендера.
Весь рендер разбит на три части:
IRender – самая низкоуровневая обертка над OpenGl (ниже этой абстракции не опуститься), умеет отрисовывать простейшие объекты (TQuad, TTriple, ISprite, IFont, и т.д.), также умеет работать с буфферами вершин и индексов... с ним пока все...
IRenderManager - менеджер среднего звена(используется только IScene3D). Получает высокоуровневые объекты рендера от наивысшего уровня(IScene), сортирует по буферам/материалам и рендерит в IRender. (На данный момент его реализация не пресутствует в движке)
IScene – высший уровень, с которым работает пользователь (Хотя не исключена возможность работы с каждым уровнем) Содержит все объекты для рендеринга, умеет отсекать нунужную геометрию и слать объекты на отрисовку IRenderManager’у. На самом деле IScene в DefoEngine разбит на две части IScene2D и IScene3D, соответственно для работы как с 2D так и с 3D графикой. Так же с помощью интерфесов сцен создаются выше упомянутые высокоуровневые объекты: Для 2D – ISprite, IAnimSprite, IFont, и т.д.Для 3D – IMesh, ITerrain, ISkyBox, и т.д
Например:
//Создаем шрифт Font:=Engine.Scene2D.CreateFont('data\fonts\font1.jpg'); //Грузим анимированный спрайт Sprite:=Engine.Scene2D.CreateAnimSprite('data\textures\asteroid.jpg', 12,0,0,45,40,5,6,'data\textures\asteroid_mask.jpg');
Ну а отрисовывать, можно пока только на низшем уровне, в IRender.
//Рисуем спрайт Engine.Render.AnimSpriteDraw(round(x),round(y),Sprite); //Пишем текст Engine.Render.FontPrint(50,20,RGBAColor(255,255,0,0), 'Simple text');
Ну пока все... как всегда жду ваших отзывов и пожеланий
#2D, #defo, #defoengine, #engine, #kirill, #res, #resource
17 июля 2008
Комментарии [7]