Ten projekt wykorzystuje wiele różnych komponentów Scene Graph, które są aktywowane przez akcję. Obejmuje to działania aktywowane przez zdarzenie:
Przełączenie widoczności siatki
Włączenie lub wyłączenie świateł
Na przykład wszystkie światła kuliste na powyższym obrazku są jednostkami Scene Graph, które zawierają komponent o nazwie triggerable_light_component, który jest klasą komponentu implementującą aktywowany interfejs. Aktywowane są różne kombinacje jednostek, gdy gracz stanie na różnych białych cokołach.
Za pomocą interfejsów Verse możesz definiować funkcje wspólne dla niepowiązanych ze sobą obiektów lub akcji. W tym przypadku typową funkcjonalnością jest aktywowanie akcji, a niepowiązane obiekty lub akcje to widoczność siatki, transformacja siatki oraz włączanie i wyłączanie świateł.
Aby dowiedzieć się więcej na temat funkcji języka Verse używanych na tej stronie, patrz:
Definiowanie interfejsu aktywatora
Zacznij od utworzenia nowego pustego pliku Verse i nadania mu nazwy Triggerable.verse. Zdefiniuj interfejs z możliwością aktywowania. Domyślną funkcjonalność i wartości pól z interfejsami można definiować lub pozostawić definiowanie i implementację klasom pochodnym. Następnie zdefiniuj zdarzenie, które jest używane do zasygnalizowania, czy jednostka Scene Graph zawierająca komponent dziedziczący z interfejsu została aktywowana.
Ten plik używa atrybutu
@editablew różnych polach interfejsu. W tym celu dołącz moduł /Verse.org/SimulationVerseusing { /Verse.org/Simulation }Interfejsy w Verse są przymiotnikami, ponieważ opisują akcję implementowaną przez klasy pochodne. Utwórz nowy interfejs o nazwie
triggerable:Versetriggerable<public> := interface:Możesz śledzić, czy obiekt z możliwością aktywowania został aktywowany, np. czy światło jest włączone lub czy siatka jest widoczna albo niewidoczna. Możliwe, że aktywujesz akcję tylko raz. Dodaj następujące pola logiczne do interfejsu
triggerable, aby je śledzić:Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseObiekty aktywowane są używane jako elementy w łamigłówkach tworzonych w dalszej części tego samouczka. Ponadto możesz użyć obiektów aktywowanych w łamigłówce jako wabików, które są aktywowane przez akcję, a elementy zachowują się tak, jakby były częścią łamigłówki, ale ich stan po uruchomieniu nie ma wpływu na rozwiązanie układanki. Dodaj pole logiczne
PuzzlePiece, aby śledzić, czy ten obiekt aktywowany jest elementem łamigłówki.Verse@editable PuzzlePiece:logic = falseAby uzyskać jeszcze większą elastyczność, możesz również wybrać łamigłówkę, w której niektóre światła muszą być włączone, a inne wyłączone, aby łamigłówka została uznana za rozwiązaną. Dodaj pole logiczne
SolvedStateTriggered, aby wskazać, czy ten element łamigłówki z obiektem aktywowanym jest uznawany za rozwiązany, niezależnie od tego, czy został aktywowany, czy nie.Verse@editable SolvedStateTriggered:logic = trueZadeklaruj trzy funkcje:
PerformAction,PerformReverseActioniPostTrigger. Ponieważtriggerablejest interfejsem, a interfejs nie zapewnia podstawowej implementacji tych funkcji, każda klasa pochodnatriggerablemusi zapewnić własną implementację każdej z tych funkcji.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():voidZdefiniuj trzy dodatkowe funkcje:
Trigger,InSolvedStateiSetInitialTriggeredState. Wszystkie te trzy funkcje mają podstawową implementację dostępną w interfejsietriggerable. FunkcjaTriggeraktywuje akcję dla komponentu, który implementuje ten interfejs,InSolvedStatedecyduje, czy komponent znajduje się w stanie rozwiązanym, aSetInitialTriggeredStateokreśla, jaki jest początkowy stan aktywowania komponentu na początku gry.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Definiowanie aktywowanego zdarzenia
Ten projekt łamigłówki wykorzystuje również zdarzenia sceny do wysyłania zdarzeń w górę lub w dół hierarchii Scene Graph, aby aktywować akcje, takie jak przekształcanie siatki lub włączanie i wyłączanie światła. W tym przypadku definiujemy zdarzenie o nazwie triggered_event, które jest wysyłane w górę hierarchii Scene Graph po aktywowaniu obiektu możliwego do aktywowania. To zdarzenie jest obsługiwane przez komponent Scene Graph w celu ustalenia, czy łamigłówka została rozwiązana.
Zdarzenia sceny wymagają interfejsu API Scene Graph. Aby korzystać z interfejsu API Scene Graph, uwzględnij moduł /Verse.org/SceneGraph
Verseusing { /Verse.org/SceneGraph }Dodaj zdarzenie sceny o nazwie triggered_event:
Versetriggered_event<public> := class(scene_event):Dodaj dwa pola do tego zdarzenia, pierwsze – opcjonalne, wskazujące jednostkę, która jest aktywowana, a drugie – pole logiczne wskazujące, czy dana jednostka została aktywowana:
VerseTriggeredEntity:?entity = false Triggered:logic = false
Kolejne kroki
Następnie utworzysz komponent łamigłówki, aby zarządzać łamigłówką i określać, kiedy zostanie rozwiązana.
Kod końcowy 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."