grupa AntalisaСтатьи

Менеджер сцены

Автор:

Прежде чем приступить к непосредственному описанию новинок, скажу о подготовительной работе:
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]