grupa AntalisaСтатьи

Улучшение кода Менеджера Сцены

Автор:

В коментариях к одной из статей (http://www.gamedev.ru/community/ants/forum/?id=54203), мне сделали замечание, которое я понял так, что графический движок должен только отрисовывать, а сама логика, манипуляции над объектами должны находиться где-то вовне - в блоке логики игры. Также сделано замечание - намек, который я понял так: что при большом колличестве объектов - экземпляров класса TMyObjects - в каждом будет повторен код процедуры отрисовки 4-угольника, что нерационально.
Поэтому, я отложил написание другой статьи и исправляю код.
Главная идея - избавиться от класса TMyObjects. А отдельно будет существовать не массив объектов, а массив свойств объекта.

В модуле LoadClasses  удаляем упоминание об объекте TMyObjects и сохраняю модуль под новым названием TextureMenager - так как в нем будет описан только данный класс.
В модуле APSceneMenager добавляю запись описывающую свойства объекта: TAPObjectsProperties = record... у класса  TAPSceneMenager добавил процедуру      procedure Draw(StartX, StartY, Size:glFloat); - это то, что я взял из описания бывшего класса. Также изменил названия процедур загрузки свойств объектов:
  procedure TexturesPropertiesFromFile(FileName:String);
  procedure ObjectsPropertiesFromFile(FileName:String);
Изменил тип массива:
  FObjectBANK: array of  TAPObjectsProperties; Так как это уже не массив объектов, то создавать каждый экземпляр класса уже не надо, поэтому удаляю много лишнего кода по всему модулю,    Для передачи информации в запись в массиве пришлось ввести новую процедуру  InitElement(номер элемента,запись свойств);  и переписать процедуры вывода изображений на экран.

Пока для упрощения я использую старое описание свойств объектов, но в Будущем все будет только усложняться:

TAPActorProperties = record  {for save in File StartProperties}
  X,Y:glFloat;  //Начальные координаты
  Xmove,Ymove:glFloat; //Возможно, объект сразу после создания начинает движение
  XAngle,YAngle,ZAngle:single; //Вращение объекта
  ScaleX,ScaleY:glFloat; //Масштабирование объекта
  ZOrder:Integer;  //Порядок отображения (глубина внутрь экрана)
  TexturResID:Integer;  //(Идентификатор текстуры)
  CurrentTile:Integer;  //Номер текущего тайла
  CurrentMovie:Integer; //номер текущего списка тайлов
  Static:Boolean; //Не реагирует на трансформации
  Visible:Boolean; //Видимость
  IsControl:Boolean; //выполняет роль визуального Контрола (например, кнопка)
  IsBackground:Boolean; //Только изображение - не выделяется, не участвует в проверках на столкновение
end;

Дописал процедуру UpdateObjects:

procedure TAPSceneMenager.UpdateObjects; //Для индивидуальной настройки использовать - процедура InitElement
var
  loop:Integer;
begin
  for loop:=0 to High(FObjectBANK) do
  begin
  FObjectBANK[loop].StartX:= FObjectBANK[loop].StartX+FObjectBANK[loop].moveX;
  FObjectBANK[loop].StartY:= FObjectBANK[loop].StartY+FObjectBANK[loop].moveY;
  FObjectBANK[loop].moveX:= FObjectBANK[loop].moveX+FObjectBANK[loop].AccelerationX;
  FObjectBANK[loop].moveY:= FObjectBANK[loop].moveY+FObjectBANK[loop].AccelerationY;
  end;
end;

В ранее созданном файле свойств объектов  ObjectTest.odf было записано у всех объектов: 
ObjectsProperties.moveX:=0.01;
ObjectsProperties.moveY:=0.01;
Это и даст анимацию:

Добавил мультимедийный таймер, в процедуру таймера добавил:
APSceneMenager.UpdateObjects;

Загрузить исходники (81.898 Кб) можно по адресу:
http://www.gamedev.ru/download/?id=4206

Откомпилировав пример можно увидеть как перемещаются нарисованные объекты.

11 сентября 2006