Game Logic

Материал из Blender3D.

Перейти к: навигация, поиск

Содержание

Логика игрового движка Blender

Введение

Игра разделена на некоторое количество blend-файлов: characters (персонажи), levels (уровни) и props (второстепенные объекты). Уровни и второстепенные объекты почти не имеют логики, только приписанные им свойства, которые персонажы используют, чтобы определиться, что с ними делать.

Изображение:Apricot_Overview_linking.png

Отдельный персонаж во внешнем файле со своими камерой, анимацией, звуками и логикой чрезвычайно полезен не только потому, что дает возможность включить одного конкретного персонажа в несколько уровней, но также потому, что можно иметь несколько персонажей одного типа на одном уровне.


Совместное использование файлов логикой

Имея логику для овцы, мы хотели бы иметь возможность добавить еще персонажей без необходимости повторять создание их логики. Это стало возможным путем недавнего добавления группы, требуемой движком игры, добавленой специально для абрикоса.

Изображение:Apricot_Frankie_sheep_group_share.png

Специфические объекты персонажа, такие как armature (арматура), mesh (сетка) и shadow mesh (сетка теней) связаны родительской связью с mesh (сеткой) манекена, который запускает логику. Все группы используют логические объекты, но имеют уникальную арматуру и сетку.

Для того, чтобы избежать однотипного поведения персонажей, вместе с персонажем запускается скрипт, который устанавливает свойство "type" (типа), основанное на потомках. Свойство типа определяет, может ли персонаж атаковать, быть побитым, перенесенным или насколько он агрессивен.

Изображение:Apricot_Frankie_momo_group_share.png

Есть два играющих персонажа (Frankie and Momo), которые также имеют общую логику, но собственные mesh (сетку) и armature (арматуру).

В поведение нет необходимости вносить изменения, но они нужны для использования различных раскладок клавиш и имеют собственную секцию экрана (splitscreen). Как в случае с овцой, это происходит, когда персонаж входит в игру, на определенный момент одновременно поддерживаются только 1 или 2 игрока, но увеличение числа игроков будет тривиальным.


States (Состояния)

States (состояния) являются новым добавлением к блендеру, созданным для проекта apricot (абрикос). Они позволят нам группировать логику в статусы, каждый из которых может быть активирован или деактивирован (можно представить их как логические слои). Состояния используются вплотную со всем комплексом игровой логики. Frankie, например, имеет состояния "простой (безделье)", "идущий", "бегущий", "падающий", "планирующий", "висящий", "тонущий" и "мертвый". Каждое состояние имеет несколько датчиков и активаторов (исполнительных устройств), которые переключают состояния в определенных условиях.

Изображение:Apricot_State_example.jpg

Cостояние безделья в файле frankie.blend

Приведем пример, как состояния переключаются во время игры

   * Initial State (исходное состояние) -> Falling (падающий)
   * Ground Collision (удар об землю)-> Idle State (состояние простоя)
   * UpKey (кнопка "вверх") -> Walk State (идущий)
   * No Ground Collision (нет удара об землю) -> Fall State (падающий)
   * Water Collision (столкновение с водой) -> Drown State (тонущий)


Элементы логики

Камера Frankie


Этот файл показывает, как работает камера абрикоса. Хотя вперед смотрящая камера 3D персонажа не так уж и сложна, остается рад трудностей, которые необходимо преодолеть.

Исходная проблема, с которой мы сталкиваемся при применении камеры Blender-а, заключается в том, что Frankie может быть затенен другими объектами, что сделает игру не играбельной.

Мы начали с того, что связали камеру и Frаnkie родительской связью, используя опцию медленного родителя для того чтобы замедлить ответ камеры Frаnkie, избегая резких и вибрирующих движений. Чтобы избежать загораживания камеры деревьями и стенами, лучевой (ray) датчик от Frаnkie указывает на камеру и использует скрипт, написанный на python, чтобы измерить (градуировать) связь с камерой, основываясь на месте соприкосновения.

Изображение:Apricot_camera_example_thumb.png

Замечания

  • В этом файле есть подставной персонаж для тестирования движения, чтобы было на что ориентировать камеру
  • Сцена с ландшафтом и столбами является сценой из набора, называемой "example_scene" (сцена-пример)
  • Клавиши движения - стрелки и пробел для прыжка. Клавиши 1 и 2 включают и выключают орбиту

Объекты и их использование (входящие в frankie.blend)

  • Frankie - родственный объект(mesh) с его свойствами и управлением со стороны игрока
  • FrankieDummy - объект, которые показывает Frankie, его меш и скелет (арматуру) в файле frankie.blend
  • Camera_Ray - пустой объект, который отслеживает камеру с места Frankie. Он отбрасывает луч в камеру и выявляет, есть ли что нибудь в ракурсе.
  • Camera_Scaler - это родитель камеры, масштабирование которго изменяет расстояние от Frankie. Масштабирование управляется скриптом на python, который использует для установки масштаба позицию Camera_Ray. (это единственный скрипт, используемый установками камеры). Есть также режим орбиты, который заставляет объект вращаться, чтобы лучше увидеть Frankie со всех сторон, пока он бездействует, тонет или мертв.
  • SlowVertParent - Это родитель камеры, используется медленное родство, так, чтобы изменения масштаба или поворота Frankie не применялись мгновенно к камере. Нам нужно использовать вершинного родственника (vertex parent) для камеры, иначе масштаб будет применен и к камере, что вызовет искажение 3D картинки.
  • MainCam - главная камера, отслеживающая Camera_Ray


Состояния Frankie (адаптировано)

Этот пример логики персонажа основан на логике Frankie и показывает, как можно использовать состояния для управления поведением без установки каких-либо свойств или запуска скриптов python.

Python нужно использовать для придания большей функциональности, но использование состояний поможет упростить и уменьшить срипты.

Изображение:Apricot_logic_state_example_thumb.png


Кнопки

  • Вверх, Вправо, Влево - движение
  • Пробел - прыжок

Свойства уровней

  • ground (земля) - используйте для определения поверхности, по которой вы можете ходить
  • kill (убить) - приводит вас к состоянию смерти (death state)

Состояния

  • 1 - Состояние простоя (безделья). Можно прыгать, ходить и поворачиваться
  • 2 - Состояние ходьбы. Можно прыгать, перейти к состоянию простоя (остановиться) и поворачивать
  • 3 - Состояние прыжка.

Только при активации для одной логической метки, движения вверх заставляют немедленно к состоянию падения. Это из-за того, что движение из других положений (в данном случае ходьбы), может смешаться с прыжком.

  • 4 - Состояние падение. Из него можно приземлиться.

Это состояние активировано при старте (обратите внимание на черную точку над состоянием) и активируется когда Frankie не касается объектов со свойством 'ground'(земля, поверхность)

  • 6 - Общее состояние для поворотов и проверка, касается ли Frankie каких-либо 'kill' (убивающих) объектов. Это состояние активировано, пока Frankie жив, иметь одно из этих состояний полезно в ситуациях, когда вы хотите, чтобы персонаж реагировал независимо от его текущего поведения.
  • 15 - Смерть, это состояние отключает общее состояние, не реагирует на команды пользователя, и после 4 секунд ликвидирует объект.

Порталы уровней

Изображение:Apricot_portal_example_thumb.png

Эта коллекция blend-файлов как один персонаж может быть внедрен в любое число сцен и файлов, легко передвигаясь между ними с помощью порталов.

Персонаж является группой объектов с игровой логикой и камерой. Эта группа привязана ко многим уровням, сохраняя логику персонажа в одном месте, где ее можно редактировать.

Эти примеры сосредотачиваются на том, как мы сделали порталы, которые могут делать следующее:

перемещаться к другому расположению на уровне;

перемещаться к другой сцене в blend-файле (объекту, если он определен) ;

перемещаться к другому blend-файлу (сцене и объекту, если они определены);

сохранять свойства персонажа, такие как жизнь и инвентарь между уровнями и blend-файлами.

Для того, чтобы сделать портал, прото добавьте объект, с которым вы можете столкнуться и наделите его свойством "portal", с величиной, к примеру, "SomeObjectName". При соприкосновении с порталом вы будете траспортированы к объекту, называемому "SomeObjectName".

Еслы вы хотите перейти к другой сцене, добавьте свойство "portal_scene", с величиной, к примеру, "MyOtherScene".

Для того, чтобы перейти в другой blend-файл, добавьте свойство "portal_blend", величина, например, "//level_2.blend". Величина является путем к другому blend-файлу, приставка // означает, что она в той же директории, что и текущий blend-файл.

Когда используются свойства "portal_scene" или "portal_blend", свойство "portal" должно присутствовать, если вы хотити установить местонахождение объекта, его величина должна быть пустой строкой.

Описанные свойства работают таким же образом, как и уровни абрикоса, однако скрипты персонажа были изменены для соответствия целям этого примера.

Взглянем, например, на порталы в этой директории.

Всплеск

Данный пример показывает, как создаются всплески для уровней воды и лавы.

Изображение:Apricot_splash_example_thumb.png

Жидким объектам нужны сенсоры соприкосновения, которые связаны с управлением "splash_logic" (логикой всплеска). В нашем случае 2 водных объекта, но вообще-то ограничений нет.

Логика всплеска (splash_logic) запускает скрипт python, назваемый "detect_splash" ("обнаружение всплеска"). При соприкосновении скрипт "detect_splash" перемещает логику всплеска в место соприкосновения и добавляет объект вслеска.

Таким образом, одновременно может произойти множество всплесков.

Объектам, которые приземляются на воду для того, чтобы плавать, тонуть или быть уничтоженными, им нужно только соприкоснуться с водой. В нашем примере динамика куба приостанавливается и он уничтожается через 200 логических тактов.

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

Объект всплеска сам по себе должен быть в деактивированном слое, для того, чтобы активатор AddObject (добавить объект) работал. См. слой 20.


Разбиение экрана на 2 игроков


Изображение:Apricot_split_screen_example_thumb.png

Этот файл показывает, как 2 образца одной и той же группы персонажей могут при старте иметь собственные клавиши управления и экраны.

Это делается с помощью инициализирующего скрипта python для каждоко персонажа, который присваивает уникальный ID, используемый для отдельной настройки каждого из них.

Как только скрипт стартует, состояние меняется на ответ только пользователю. Объекты персонажа в этой сцене дублируются, изменяются на сцену "character_group"(группа персонажа) для того, чтобы увидеть их логику и скрипт "frank_init_2player" (Фрэнк запускает двухпользовательский режим), чтобы увидеть, как они инициализируются.

Для Игрока 1 используйте стрелки, для Игрока 3 используйте клавиши "W","A","S","D".

Меню

Изображение:Apricot_menu_example_thumb.png

Этот blend-файл предсталяет упрощенную версию главного меню YoFrankie.

Меню имеет следующие функции:

  • ввод с мышки, клавиатуры или джойстика
  • пункты меню могут загружать сцены, blend-файлы или подключать ваши собственные активаторы (действия)
  • пункты меню toggle и radio можно использовать для установки настроек конфигурации
  • настройки можно сохранять в файл и загружать из него с использованием функции исполнительного механизма игры
  • логика общая, ее можно использовать во многих меню.


Функционирование

Основа меню достаточно проста, все объекты начинаются с "item_", отсортированы по алфавиту и обработаны как пункты меню (menu items). Одновременно можно выделить только один пункт меню, что можно осуществить стрелками вверх и вниз или проведя мышкай по нему. Нажатие "Enter" или щелчок мышки выполнит действие, присвоенное этому пункту меню.

Скрипт "menu_select" (выделение меню) применяется там, где наиболее контролируется логика меню. Он запускает объект "menu_logic" (логики меню), реагируя на ввод пользователея путем сканирования сцены на предмет объектов с приставкой "item_" и соответственно подстраивая их свойства.

Свойство "active" (активен) используется всеми пунктами. Когда оно равно 1, сенсор определяет это и воспроизводит анимацию. Для YoFrankie мы выбрали использование невидимых пунктов для того, чтобы иметь возможность применить анимацию к одному или нескольким объектам, чем достигается бОльшая область, где можно активировать мышкой.

Типы активации пунктов

триггер

Этим пунктам нужно присвоить дополнительное свойство "trigger". Когда пункт меню активен, триггер установлен в 1. Логика пунктов должна проверить состояние триггера, чтобы действовать в зависимости от него. После исполнения триггер должен быть сброшен в 0. См. пункты меню "выход", "сохранить конфигурацию" и "загрузить конфигурацию" ("Quit", "Save Config" и "Load Config").

портал

Используя те же свойства, что и в уровнях, порталы могут загружать blend-файлы, сцены и объекты (для установки в исходное местоположение).

Свойствами являются:

  • "active"(активен): описано выше;
  • "portal": имя объекта;
  • "portal_scene": имя сцены;
  • "portal_blend": имя blend-файла

В качестве примеров портала см. пункты меню "открыть blend-файл", "настроить", "назад" ("Open Blendfile", "Configure" и "Back").

Настройка

Если вы хотите настроить установки в меню, можно использовать словарь питона (python) "GameLogic.globalDict", который сохраняется между загрузкой файлов и может быть сохранен и загружен в файл с движком игры.

Вся настройка игры хранится в словаре - GameLogic.globalDict['conf'].

Есть два типа кнопок, которые автоматически настраивают словарь питона, когда на них нажимают. Обе используют свойствоо "conf_key" для того, чтобы определить, какая настройка меняется.

Хотя есть всего несколько кнопок, много кнопок конфигурации можно добавить без внесения изменений во внутреннюю работу меню.

См. скрипт "init_options" и пункты меню в параметрах сцены, чтобы узнать как это делается.

Переключение (настройка)

Тут все довольно просто, кнопка togglе (переключения) включает или выключает величину (свойство).

  • "active"(активен): описано выше.
  • "toggle"(переключение): 0 или 1, пункт меню проверяет это для отображения бОльшей точки, когда включено.
  • "conf_key": велючает этот параметр - GameLogic.globalDict['conf'][conf_key] = True or False (Правда или Ложь)

Радио (настройка)

В отличие от кнопки переключения (toggle), много радиокнопок разделят один и тот же ключ conf_key.

  • "active"(активен): описано выше.
  • "radio": состояние conf_key, когда кнопка нажата. Так, например, три кнопки: low/med/high (низкий, средний, высокий) будут иметь состояние "radio" равным 0, 1, 2.
  • "enabled"(включено): только одна из радиокнопок, которые делят один и тот же ключ сonf_key может быть одновременно задействована (включена). Это используется для воспроизведения анимации выделением включенной опции.
  • "conf_key"(ключ конфигурации): переключением этой опции GameLogic.globalDict['conf'][conf_key] будет установлен в статус "radio" для определенных кнопок.

Примечание: этот пример пропускает настроку связанных кнопок, так как она довольно запутанна и специфична для YoFrankie.

Детали логики

Следующая страница:Детали логики

Личные инструменты