Реклама:

Атака клонов

Пусть у нас есть большой лес, в котором много-много одинаковых деревьев или, скажем, много деревьев нескольких разных видов. Пример похож на предыдущий, только мы тут ничего динамически не создаем и не уничтожаем — на этом уровне деревья есть всегда. Проблема будет при загрузке уровня. Создание стольких деревьев займет кучу времени. Но ведь они все одинаковые! То есть, мы раз за разом загружаем с винчестера и создаем в памяти копии одного и того же. Загрузили. Играем. Перед рендером каждого из деревьев выполняются подготовительные процедуры. Для каждого дерева они будут одними и теми же, но вызывать мы их будем опять много раз, по числу деревьев! Расточительно получается. И память под каждое дерево резервировать надо, и обработка каждого из них время занимает.

Вот бы загрузить одно-единственное дерево, а когда надо будет вывести на экран остальные деревья, просто показать графической библиотеке, откуда брать необходимые данные. Это ж какая экономия ресурсов получится, какой прирост fps! Такие "ложные" деревья (и не только деревья — что угодно), о которых в памяти хранится только частная информация (положение в пространстве, углы поворота), а одинаковая информация хранится только один раз, называются прокси-объектами.

В GLScene для создания прокси-объектов существует специальный класс — TGLProxyObject. Пользоваться им очень просто. Сначала создаем объект-источник, т.е. единственное дерево, например, так.

Tree:=TGLFreeFrom(glscenel.objects.AddNewChild (TGLFreeFrom) ) ; //Загружаем его модель: Tree. LoadFroitiFi le ( ' Tree. 3ds ' ) ; //Загружаем его текстуру: Tree .Material .Texture .Disabled: =f aise; Tree.Material.Texture.Image,LoadFromFile(1 tree.jpg'); //А теперь создадим десять деревьев-клонов в случайных местах: for i:=l to 10 do begin //Создаем очередной прокси-объект proxy:=TGLProxyObj ееt(glscenel.objееts.AddNewChiId (TGLProxyObject)); with proxy do begin

//В свойство MasterObject записываем наше дерево-образец MasterObject:=Tree;

//Показываем, что наследоваться должна только структура объекта ProxyOptions:=[pooObjects];

//Ориентацию дерева в пространстве надо оставить неизменной Direction:= Tree.Direction; Up:= Tree.Up;

//А вот положение задаем случайное Position.X:=Random(100); Position.Y:=Random(100);

//И повернем дерево на случайный угол, чтобы лучше смотрелось

RollAngle:=Random(360);

end;

end;

Теперь у нас есть десяток деревьев по цене одного. Обратите внимание, что если мы как-нибудь изменим объект-оригинал, это изменение мгновенно отразится на всех объектах-клонах.

Программирование игры на основе движка ОЬБсепе: интерфейс и управление

В любой игре геймер управляет своим заэкранным альтер-эго с помощью разнообразных устройств: клавиатуры, мыши, джойстика, геймпада, виртуальных перчаток, а иногда даже взгляда! Чем больше игра поддерживает устройств управления, тем лучше. Стандарт де-факто для стратегических игр — мышь и клавиатура. В экшенах и аркадах к необходимому минимуму добавляются джойстик и геймпад. В вашей игре просто обязан быть этот минимум. Вы спросите, зачем, к примеру, той же "Контре" джойстик, если настоящие джедаи выбирают мышь? У разных людей разные вкусы. В США, например, самым популярным игровым устройством является вовсе не мышь, а геймпад. Надеюсь, я убедил вас, что поддержка хотя бы этих четырех устройств необходима. А теперь поговорим о том, как эту самую поддержку внедрить в движок.


⇐ Предыдущая страница| |Следующая страница ⇒