В этом проекте используется несколько различных компонентов Scene Graph, которые активируются при возникновении события. Сюда входят действия, которые активируются событием:
Включение/выключение видимости сетки
Включение или выключение источников света
Например, все источники света сферы на изображении выше — это модули Scene Graph, у которых есть компонент triggerable_light_component, который представляет собой класс компонента, реализующий интерфейс активируемых компонентов . Различные комбинации модулей активируются, когда игрок встаёт на различные белые пьедесталы.
Интерфейсы Verse можно использовать для определения общих функций для не связанных объектов или действий. В данном случае общая функция активирует действие, где не связанными объектами или действиями являются следующие: видимость сетки, преобразование сетки, а также включение или выключение источников света.
Дополнительная информация о функциях языка Verse, используемых на этой странице, приведена на следующих страницах:
Определение интерфейса активируемых компонентов
Для начала создадим новый пустой файл Verse и назовём его Triggerable.verse. Определим интерфейс активируемых компонентов. Вы можете определить стандартные функции и значения полей для интерфейсов либо предоставить их определение и реализацию дочерним классам. Далее определим событие, которое будет подавать сигнал о том, был ли активирован модуль Scene Graph, содержащий компонент, унаследованный от интерфейса активируемых компонентов.
В этом файле используется атрибут
@editableдля различных полей интерфейса. Для этого добавьте модуль /Verse.org/Simulation:Verseusing { /Verse.org/Simulation }Интерфейсы в Verse являются зависимыми, то есть, они лишь описывают действие, которое реализуют дочерние классы. Создайте новый интерфейс с названием
triggerable(«активируемые компоненты»):Versetriggerable<public> := interface:Можно настроить отслеживание того, был ли приведён в действие активируемый объект, то есть, включён ли источник света, видима ли сетка. При желании можно задать активацию действия только один раз. Добавьте следующие логические поля в
triggerableдля отслеживания следующего:Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseАктивируемые объекты используются в качестве деталей головоломок, создание которых будет описано далее в этом руководстве. Кроме того, можно использовать активируемые объекты в качестве ложных деталей в головоломке, которые активируются любым действием так же, как и любая другая деталь головоломки, но их активированное состояние не способствует решению головоломки и не отвлекает от неё. Добавьте логическое поле
PuzzlePiece, чтобы следить за тем, является ли этот активируемый объект деталью головоломки.Verse@editable PuzzlePiece:logic = falseДля ещё большего разнообразия можно сделать так, чтобы головоломка считалась решённой, когда одни источники света включены, а другие выключены. Добавьте логическое поле
SolvedStateTriggered, чтобы указать, считается ли эта деталь головоломки с активируемым объектом решённой после активации или при отсутствии активации.Verse@editable SolvedStateTriggered:logic = trueОбъявите три функции:
PerfectAction,PerformReverseActionиPostTrigger. Посколькуактивируемый компонентявляется интерфейсом, а интерфейс не обеспечивает базовую реализацию этих функций, любой дочерний классtriggerableдолжен предоставлять собственную реализацию каждой из этих функций.Verse# Action performed when transitioning from not triggered to triggered state PerformAction():void # Action performed when transitioning from triggered to not triggered state PerformReverseAction():void # Action performed after PerformAction or PerformReverseAction is called PostTrigger():voidОпределите три дополнительные функции:
Trigger,InSolvedStateиSetInitialTriggeredState. Все эти три функции имеют базовую реализацию, которая обеспечена в интерфейсеtriggerable.Triggerактивирует действие для компонента, реализующего этот интерфейс,InSolvedStateопределяет, находится ли компонент в активированном решённом состоянии, аSetInitialTriggeredStateопределяет начальное состояние активации компонента в начале игры.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Определение активированного события
В этом проекте головоломки также используются события сцены для передачи событий вверх и вниз по иерархии Scene Graph, чтобы активировать такие действия, как преобразование сетки или включение или выключение источника света. В данном случае определим событие triggered_event, которое передаётся вверх по иерархии Scene Graph при срабатывании активируемого объекта. Это событие обрабатывается компонентом Scene Graph, чтобы определить, решена ли головоломка.
Для событий сцены требуется API Scene Graph. Чтобы использовать API Scene Graph, включите модуль /Verse.org/SceneGraph /Verse.org/Simulation:
Verseusing { /Verse.org/SceneGraph }Добавьте событие сцены triggered_event:
Versetriggered_event<public> := class(scene_event):Добавьте к этому событию два поля: первое — необязательное, указывающее на активированный модуль, а второе — логическое, указывающее, был ли активирован этот модуль:
VerseTriggeredEntity:?entity = false Triggered:logic = false
Следующие шаги
Далее мы создадим компонент головоломки для управления головоломкой и определения момента её решения.
Окончательный код для Triggerable.verse
<#
Interface for triggering an action on a component.
Any component that you want to be triggered when the touch_component has it's Touch function called
must implement this interface.
#>
using { /Verse.org/Simulation }
OnlyTriggerOnceToolTip<public><localizes>:message="Whether this triggerable component should only ever be triggered once."
SolvedStateTriggeredToolTip<public><localizes>:message="Whether this puzzle pieces solved state is the triggered state. Note: Only relevant if PuzzlePiece is set to true."
PuzzlePieceToolTip<public><localizes>:message="Whether this entity is part of a puzzle solution."