Dieses Projekt verwendet mehrere verschiedene Scene-Graph-components, die durch eine Action ausgelöst werden. Dazu gehören Actions, die von einem event ausgelöst werden:
Zum Beispiel sind alle Kugellichter im obigen Bild Scene-Graph-Entitäten mit einer Komponente namens triggerable_light_component, die eine Komponenten-class ist, die das triggerable-Interface implementiert. Die verschiedenen Kombinationen von Entitäten werden ausgelöst, wenn der Spieler auf verschiedene weiße Sockel tritt.
Du kannst Verse-Interfaces verwenden, um gemeinsame Funktionalität zwischen nicht zusammenhängenden Objekten oder Actions zu definieren. In diesem Fall ist die gewöhnliche Funktionalität das Auslösen einer Action und die unabhängigen Objekte oder Actions sind die mesh-Sichtbarkeit, die Mesh-Transformation und das Ein- oder Ausschalten von Lichtern.
Mehr Informationen zu den auf dieser Seite verwendeten Verse-Sprachfunktionen findest du unter:
Triggerable-Interface definieren
Zunächst erstellst du eine neue leere Verse-Datei und nennst sie Triggerable.verse. Du definierst das triggerable-Interface. Du kannst Standard-Funktionalität und Feldwerte mit Interfaces definieren, oder sie von Child-Klassen definieren und implementieren lassen. Dann definierst du ein Event, mit dem signalisiert wird, ob eine Scene-Graph-Entität, die eine Komponente hat, die vom triggerable-Interface erbt, ausgelöst wurde.
Diese Datei verwendet das Attribut
@editablefür verschiedene Interface-Felder. Dazu musst du das /Verse.org/Simulation- Modul einbinden:Verseusing { /Verse.org/Simulation }Interfaces in Verse sind Adjektive, da sie eine Action beschreiben, die Klassen implementieren. Erstelle ein neues Interface mit dem Namen
triggerable:Versetriggerable<public> := interface:Vielleicht möchtest du nachverfolgen, ob ein auslösbares Objekt ausgelöst wurde oder nicht – zum Beispiel, ob ein Licht an oder aus ist oder ob ein Mesh sichtbar oder unsichtbar ist. Es ist möglich, dass du eine Action nur einmal auslösen möchtest. Füge die folgenden Logikfelder zu
triggerablehinzu, um diese nachzuverfolgen:Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseAuslösbare Objekte werden als Teile in den später in diesem Tutorial erstellten Rätseln verwendet. Außerdem kannst du auslösbare Objekte als Decoy-Teile in einem Rätsel verwenden, die durch eine Action ausgelöst werden. Die Teile agieren so, als wären sie Teil des Rätsels, aber ihr ausgelöster Zustand trägt nicht zur Lösung des Rätsels bei oder beeinträchtigt es. Füge das Logikfeld
PuzzleItemhinzu, um nachzuverfolgen, ob es sich bei diesem auslösbaren Objekt um ein Rätselteil handelt oder nicht.Verse@editable PuzzlePiece:logic = falseFür noch mehr Flexibilität möchtest du vielleicht auch ein Rätsel, bei dem einige Lichter an und andere aus sein müssen, damit das Rätsel als gelöst gilt. Füge ein
SolvedStateTriggered-Logikfeld hinzu, um anzugeben, ob dieses auslösbare Objekt-Rätselteil als gelöst gilt, wenn es ausgelöst wird oder nicht.Verse@editable SolvedStateTriggered:logic = trueDeklariere drei Funktionen:
PerformAction,PerformReverseActionundPostTrigger. Datriggerableein Interface ist und das Interface keine Basisimplementierung für diese Funktionen bereitstellt, muss jede Child-Klasse vontriggerableihre eigene Implementierung jeder dieser Funktionen bereitstellen.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():voidDefiniere drei zusätzliche Funktionen:
Trigger,InSolvedState, undSetInitialTriggeredState. Diese drei Funktionen haben alle eine Basisimplementierung, die imtriggerable-Interface bereitgestellt wird.Triggerlöst die Action für die Komponente aus, die dieses Interface implementiert,InSolvedStateentscheidet, ob sich die Komponente in einem gelösten ausgelösten Zustand befindet, undSetInitialTriggeredStatebestimmt, was der anfänglich ausgelöste Zustand einer Komponente zu Beginn des Spiels ist.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Ausgelöst-Event definieren
Dieses Rätselprojekt verwendet auch Szenen-Events, um Events in der Scene-Graph-Hierarchie nach oben oder unten zu senden, um Actions wie die Transformation eines Mesh oder das Umschalten eines Lichts zu triggern. In diesem Fall definieren wir ein Event mit dem Namen triggered_event, das in der Scene-Graph-Hierarchie nach oben gesendet wird, wenn ein auslösbares Objekt ausgelöst wird. Dieses Event wird von einer Scene-Graph-Komponente verarbeitet, um zu bestimmen, ob ein Rätsel gelöst ist oder nicht.
Szenen-Events erfordern die Scene-Graph-API. Um die Scene-Graph-API zu verwenden, musst du das /Verse.org/SceneGraph- Modul einbinden:
Verseusing { /Verse.org/SceneGraph }Füge ein Szenen-Event mit dem Namen triggered_event hinzu:
Versetriggered_event<public> := class(scene_event):Füge zu diesem Event zwei Felder hinzu. Das erste ist ein optionales Feld, das die Entität angibt, die ausgelöst wurde, und das zweite eine Logik, die angibt, ob diese Entität ausgelöst wurde:
VerseTriggeredEntity:?entity = false Triggered:logic = false
Nächste Schritte
Als Nächstes erstellst du die Rätselkomponente, um ein Rätsel zu verwalten und zu bestimmen, wann es gelöst ist.
Endgültiger Code für 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."