--- title: Структурные элементы brief: В этом руководстве подробно описан принцип работы игровых объектов, компонентов и коллекций. --- # Структурные элементы В основу дизайна Defold заложены несколько концепций, качественное освоение которых может потребовать временных затрат. Это руководство объясняет, как устроены структурные элементы Defold. Прочитав это руководство, стоит перейти к [руководству по адрессации](/manuals/addressing) и [передачи сообщений](/manuals/message-passing). Также имеется набор [уроков](/tutorials/getting-started), доступных в редакторе и позволяющих быстрее приступить к работе. ![Building blocks](images/building_blocks/building_blocks.png) В Defold существуют три основных типа структурных элементов, используемых для конструирования игр: Коллекция (collection) : Коллекция представляет собой файл, используемый для структурирования игры. В коллекциях выстраиваются иерархии игровых объектов и других коллекций. Как правило, они используются для структурирования игровых уровней, групп врагов или персонажей, сформированных из нескольких игровых объектов. Игровой объект (game object) : Игровой объект --- это контейнер с идентификатором, положением, вращением и масштабом. Он используется в качестве контейнера с компонентами. Обычно они используются для создания игровых персонажей, пуль, системы правил игры или для загрузки/выгрузки уровней. Компонент (сomponent) : Компонентами являются сущности, которые помещаются в игровой объект, с целью придать им визуальное, звуковое и/или логическое представление в игре. Обычно используются для создания спрайтов персонажей, файлов сценариев, для добавления звуковых эффектов или эффектов частиц. ## Коллекции (Collections) Коллекции — это древовидные структуры, содержащие игровые объекты и другие коллекции. Каждая коллекция всегда сохраняется в виде файла. При запуске движка Defold загружается единственная _начальная коллекция_, указанная в файле настроек *game.project*. Эта коллекция часто называется "main.collection", но вы можете выбрать любое имя по своему усмотрению. Коллекция может содержать игровые объекты и другие коллекции (по ссылке на файл субколлекции), с произвольной глубиной вложенности. Ниже приведён пример файла под названием "main.collection". Он содержит один игровой объект (с идентификатором "can") и одну субколлекцию (с идентификатором "bean"). Субколлекция, в свою очередь, содержит два игровых объекта: "bean" и "shield". ![Коллекция](images/building_blocks/collection.png) Обратите внимание, что субколлекция с идентификатором "bean" хранится в отдельном файле под названием "/main/bean.collection" и лишь ссылается в "main.collection": ![Коллекция Bean](images/building_blocks/bean_collection.png) Саму коллекцию адресовать нельзя, поскольку в рантайме нет объектов, соответствующих коллекциям "main" и "bean". Тем не менее, иногда требуется использовать идентификатор коллекции как часть _пути_ к игровому объекту (см. [руководство по адресации](/manuals/addressing) для подробностей): ```lua -- file: can.script -- get position of the "bean" game object in the "bean" collection local pos = go.get_position("bean/bean") ``` Коллекция всегда добавляется в другую коллекцию в качестве ссылки на файл коллекции: Выполните правый клик по коллекции в представлении *Outline* и выберите Add Collection File. ## Игровые объекты (Game objects) Игровые объекты --- это простые объекты, каждый из которых имеет свою продолжительность жизни во время выполнения игры. Игровые объекты имеют позицию, вращение и масштаб, которыми можно манипулировать и анимировать во время выполнения. ```lua -- animate X position of "can" game object go.animate("can", "position.x", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_LINEAR, 1.0) ``` Игровые объекты можно использовать пустыми (например, в качестве маркеров позиции), но обычно они оснащены различными компонентами, такими как спрайты, звуки, скрипты, модели, фабрики и др. Игровые объекты либо создаются в редакторе и помещаются в файлы коллекции, либо динамически создаются во время выполнения посредством _фабрик_. Игровые объекты добавляются в коллекцию непосредственно (на месте), либо в качестве ссылки на файл игрового объекта: Выполните правый клик по коллекции в представлении *Outline* и выберите Add Game Object (добавить на месте) или Add Game Object File (добавить в качестве ссылки на файл). ## Компоненты :[components](../shared/components.md) Список всех доступных типов компонентов см. в [обзоре компонентов](/manuals/components/). ## Объекты, добавленные на месте или по ссылке При создании _файла_ коллекции, игрового объекта или компонента, создается шаблон, или прототип. При этом файл добавляется только в файловую структуру проекта, к запущенной игре ничего не добавляется. Чтобы добавить экземпляр коллекции, игрового объекта или компонента на основе файла шаблона, необходимо добавить его в один из файлов коллекции. Не сложно понять, на каком файле основан экземпляр объекта в представлении Outline. Файл "main.collection" содержит три экземпляра, которые основаны на файлах: 1. Субколлекция "bean". 2. Скрипт "bean" в игровом объекте "bean" в субколлекции "bean". 3. Скрипт "can" в игровом объекте "can". ![Instance](images/building_blocks/instance.png) Преимущество создания файлов-шаблонов становится очевидным, когда имеются несколько экземпляров игрового объекта или коллекции и их все необходимо изменить: ![GO instances](images/building_blocks/go_instance.png) Здесь изображено, как изображение спрайта в файле-прототипе изменяется, и все экземпляры, использующие этот файл, немедленно обновляются: ![GO changing prototype](images/building_blocks/go_change_blueprint.png) При изменении файла шаблона любой экземпляр, использующий этот файл, будет немедленно обновлен. ![GO instances updated](images/building_blocks/go_instance2.png) ## Подчинение игровых объектов В файле коллекции можно строить иерархии игровых объектов, так чтобы один или несколько игровых объектов становились дочерними по отношению к одному родительскому игровому объекту. Просто перетащите один игровой объект и бросьте его на другой, и перетаскиваемый игровой объект станет дочерним по отношении к целевому (но который бросили): ![Childing game objects](images/building_blocks/childing.png) Объектная иерархия "родительский-дочерний" --- это динамическое отношение, влияющее на то, как объекты реагируют на трансформации. Любые трансформации (перемещение, вращение или масштабирование), применяемые к объекту, будут, в свою очередь, применяться к дочерним элементам объекта, как в редакторе, так и во время выполнения: ![Child transform](images/building_blocks/child_transform.png) И наоборот, дочерние трансформации выполняются в локальном пространстве родителя. В редакторе можно выбрать, редактировать дочерние игровые объекты в локальном пространстве или в мировом, выполнив Edit ▸ World Space (по умолчанию) или Edit ▸ Local Space. Также существует возможность изменить родителя объекта во время выполнения, отправив объекту сообщение `set_parent`. ```lua local parent = go.get_id("bean") msg.post("child_bean", "set_parent", { parent_id = parent }) ``` ::: important Распространенным заблуждением является то, что расположение игрового объекта в иерархии коллекции меняется, когда он становится частью иерархии "родительский-дочерний". Однако, это две разные вещи. Иерархии "родительский-дочерний" динамически изменяют граф сцены, что позволяет визуально привязывать объекты друг к другу. При этом единственное, что определяет адрес игрового объекта, это его место в иерархии коллекции. Адрес статический на протяжении всего срока существования объекта. :::