Реклама:

Динамическое создание объектов

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

Предположим, вы создаете модуль вооружения и хотите запрограммировать очередь из пулемета. Все бы ничего, но откуда вы знаете, сколько игрок может выпустить пуль за всю игру? С помощью редактора объектов в IDE GLScene можно создавать любые объекты, но только если вы четко знаете, сколько и каких объектов вам нужно. В большинстве случаев это неприемлемо. К примеру, у вас в игре есть 20 уровней, у каждого уровня — свой набор объектов. И что же, создавать перед началом игры все объекты всех уровней? Это долго, да и займет огромное количество памяти. Единственный выход— создавать объекты прямо во время игры, динамически. В GLScene динамическое создание любого объекта состоит из двух стадий— создания экземпляра класса этого объекта и присвоения ему необходимых свойств. Возьмем уже упоминавшийся пример с очередями у пулемета и динамически создадим пулю. Предположим, пуля у нас будет промтосфе-рой. За сферы в GLScene отвечает класс TGLSphere. Казалось бы, можно написать так:

Sphere:=TGLSphere.Create

Однако команда работать не будет, так как каждому объекту в GLScene надо зарегистрироваться в очереди объектов. Кроме того, объект нельзя создать в "пустоте", он должен быть привязан к какому-то объекту более высокого уровня. Корневой объект самого высокого уровня — glscenel .Objects (если объект компонента TGLScene у вас называется glscenel). Правильный вариант:

Sphere:=TGLSphere (glscenel.Objects.AddNewChild(TGLSphere))

Разберем эту строчку по частям. У корневого объекта glscenel. Objects мы вызываем метод AddNewChild, который добавляет в корень объект класса, указанный в параметре (в данном случае это сфера — TGLSphere). Так тоже можно: в параметры процедурам передавать не объекты, а целые классы. Зачем перед присвоением нужно преобразование типа в TGLSphere? Дело в том, что метод AddNewChild, что бы вы ему в параметр ни передали, возвращает объект класса TGLBaseSceneObject. Нас это не устраивает, поэтому мы "и преобразуем тип в TGLSphere. Получившийся объект присваивается переменной Sphere. Теперь с помощью этой переменной мы можем нашей пуле задать разные параметры, например положение в пространстве:

Sphere.Position.X:= Sphere.Position.Y:= Sphere.Position.Z:-

или цвет:

Sphere.Material.FrontProperties.Di ffuse=

Динамическое создание моделей мы разобрали, а теперь поговорим о динамическом их уничтожении. В самом деле, пуля когда-нибудь попадает в стену, человека или же улетит в голубую даль. С этого момента она больше не нужна. Если мы так и оставим ее, она будет занимать какую-то область памяти. Учитывая, сколько выстрелов делает среднестатистический кемпер, пока его "нычку" не обнаружат, нам всей памяти компьютера не хватит, чтобы хранить такое количество пуль. Поэтому любые объекты игры, которые стали ненужными, надо немедленно уничтожать. Единственный правильный способ сделать это — вызвать метод Free, например:


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