Менеджер сцены
Автор: Antalis
Прежде чем приступить к непосредственному описанию новинок, скажу о подготовительной работе:
1. Создал 5 изображений: ufo1.png, ufo2.png, ufo3.png, ufo4.png, ufo5.png - по-разному раскрашенные летающие тарелки.
2. Создал RES-файл с этими изображениям
3. Подключил данный файл к главному модулю.
4. Подготовил 2 типизированных файла (см. предыдущую лекцию):
ObjectTest.odf и TexturTest.tdf
таких типов:
//Свойства объекта
TAPObjectsProperties = record
size:glFloat;
StartX:glFloat;
StartY:glFloat;
moveX:glFloat;
moveY:glFloat;
AccelerationX:glFloat;
AccelerationY:glFloat;
TextureID:GLUint;
end;
//свойства изображения
TTexturProperties = record
ID:GLUint; //будущий идентификатор текстуры
Name: string[16]; //название ресурса
TileCountX: Byte; //деление по-горизонтали изображения на тайлы
TileCountY: Byte; //деление по-вертикали изображения на тайлы
end;
В первом сделал 5 записей для описания 5 объектов, и во втором 5 записей (для каждого изображения).
5. В модуле LoadClasses дописал новые функциональные возможности класса TMyObjects, добавив 2 вида конструкторов (перегрузка функций, т.е. создал 2 процедуры с одним названием, но с разным колличеством аргументов)
Добавил 2 вида процедуры Draw, процедуру Init - благодаря которой можно настроить сразу все переменные данного класса, а также свойство только для чтения TextureID, которая в принципе нужна только в процессе отладки:
procedure Draw(MoveX, MoveY:glFloat); overload;
procedure Draw; overload;
procedure Init(Data:TAPObjectsProperties);
property TextureID:GLUint read FTextureID; //Свойство только для чтения
6. Создал новый модуль unit APSceneMenager - где и расположилось описание класса Менеджера Сцены (TAPSceneMenager).
Весь список моих ранее созданных модулей ( и OpenGL, pngImage) подключаем к нему:
PNG_to_RGBA, SetDC_procedure, LoadClasses;
Во внутреннем пространстве класса помещаем следующие поля
private
FObjectBANK: array of TMyObjects; //Хранилище объектов
FTextureMenager:TTextureMenager; //Знакомый нам менеджер текстур
FObjectCount:Cardinal; //Колличество объектов в сцене
FTexturCount:Cardinal; //Колличество текстур в сцене
В публичной секции создаем метод загрузки свойств из файлов
procedure CreateTexturesFromFile(FileName:String);
procedure CreateObjectsFromFile(FileName:String);
Еще один метод - это уже отображение загруженных из файлов объектов
procedure RenderObjects; overload;
Еще один метод - изменение значений свойств объектов (например, координаты их вывода на экран), но эту процедуру я еще не написал (Пора ложиться спать)
procedure UpdateObjects; // произвести изменения объектов
Ну и для доступа к полям добавил 2 свойства, которые считывают из внутренних переменных нужные значения (использовал для проверки работы класса)
property ObjectCount:Cardinal read FObjectCount; //Колличество объектов
property TexturCount:Cardinal read FTexturCount; //колличество текстур
end;
При испольлзовании Менеджера сцены достаточно подключить его модуль к главной форме, создать экземпляр данного класса
APSceneMenager:=TAPSceneMenager.Create;
Загрузить данные из файлов:
APSceneMenager.CreateTexturesFromFile('TexturTest.tdf'); //загружаем данные из заранее созданного файла свойств текстур
APSceneMenager.CreateObjectsFromFile('ObjectTest.odf'); //загружаем данные из заранее созданного файла свойств объектов
В процедуре отрисовки формы нужно всего лишь написать:
APSceneMenager.RenderObjects;
И все объекты отобразяться на экране в соответствии с их свойствами, записанными в заранее подготовленные файлы.
Для разнообразия я ввел еще две процедуры:
procedure RenderObjects(Number) - изобразить объект под таким-то номером
procedure RenderObjects(Number,TexturID) - изобразить объект под таким-то номером, с такой-то текстурой. Кстати, ID текстур начинается с 1
Уже сейчас можно сделать предварительный вывод - очень интерессно и достаточно легко (когда знаешь материал) создавать объектную надстройку над низкоуровневой библиотекой OpenGL.
Архим исходника доступен для скачивания:
http://www.gamedev.ru/download/?id=4187
7 сентября 2006
Комментарии [2]