Улучшение кода Менеджера Сцены
Автор: Antalis
В коментариях к одной из статей (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