Questo progetto utilizza componenti Scene Graph differenti attivati da un'azione. Sono incluse le azioni attivate da un evento:
Ad esempio, tutte le luci sferiche nell'immagine precedente sono entità Scene Graph che hanno un componente denominato triggerable_light_component, una classe di componente che implementa l'interfaccia attivabile. Le diverse combinazioni di entità sono attivate quando il giocatore sale su piedistalli bianchi differenti.
Puoi utilizzare le interfacce di Verse per definire una funzionalità comune tra oggetti o azioni non correlate. In questo caso, la funzionalità comune è l'attivazione di un'azione e gli oggetti o le azioni non correlate sono visibilità della mesh, trasformazione della mesh e accensione o spegnimento delle luci.
Per maggiori informazioni sulle funzioni del linguaggio Verse utilizzate in questa pagina, vedi:
Definisci l'interfaccia attivabile
Inizierai creando un nuovo file Verse vuoto e nominandolo Triggerable.verse. Sarai tu a definire l'interfaccia attivabile. Puoi definire la funzionalità predefinita e i valori dei campi con le interfacce oppure lasciarli alle classi figlie per definirli e implementarli. Quindi definirai un evento utilizzato per segnalare se un'entità Scene Graph avente un componente che eredita dall'interfaccia attivabile è stata attivata.
Questo file utilizza l'attributo
@editablesu vari campi dell'interfaccia. A tale scopo, includi /Verse.org/Simulation modulo:Verseusing { /Verse.org/Simulation }Le interfacce in Verse sono aggettivi poiché descrivono un'azione implementata dalle classi figlie. Crea una nuova interfaccia denominata
triggerable:Versetriggerable<public> := interface:Puoi monitorare se un oggetto attivabile è stato attivato o meno, ad esempio se una luce è accesa o spenta o se una mesh è visibile o invisibile. È possibile che tu debba attivare un'azione una sola volta. Aggiungi i seguenti campi logici ad
attivabileper tenerne traccia:Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseGli oggetti attivabili sono utilizzati come pezzi dei puzzle creati più avanti in questo tutorial. Inoltre, potresti utilizzare gli oggetti attivabili come pezzi diversivo di un puzzle attivati da un'azione: i pezzi si comportano come se facessero parte del puzzle, ma il loro stato attivato non contribuisce né preclude la risoluzione di un puzzle. Aggiungi un campo logico
PuzzlePieceper monitorare se l'oggetto attivabile è un pezzo del puzzle o meno.Verse@editable PuzzlePiece:logic = falsePer una maggiore flessibilità, potrebbe anche occorrerti un puzzle in cui alcune luci devono essere accese e alcune devono essere spente perché il puzzle sia considerato risolto. Aggiungi un campo logico
SolvedStateTriggeredper indicare se questo pezzo del puzzle dell'oggetto attivabile è considerato risolto nel caso sia attivato o non attivato.Verse@editable SolvedStateTriggered:logic = trueDichiara tre funzioni:
PerformAction,PerformReverseActionePostTrigger. Poichéattivabileè un'interfaccia e l'interfaccia non fornisce un'implementazione di base per queste funzioni, qualsiasi classe figlia diattivabiledeve fornire la propria implementazione di ciascuna di queste funzioni.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():voidDefinisci tre funzioni aggiuntive:
Trigger,InSolvedStateeSetInitialTriggeredState. Queste tre funzioni hanno tutte un'implementazione di base fornita nell'interfacciaattivabile.Triggerattiva l'azione per il componente che implementa questa interfaccia,InSolvedStatedecide se il componente è in uno stato di attivazione risolto eSetInitialTriggeredStatedetermina lo stato di attivazione iniziale di un componente all'inizio della riproduzione.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Definisci evento attivato
Questo progetto del puzzle utilizza gli eventi di scena anche per inviare eventi in alto o in basso nella gerarchia del Scene Graph per attivare azioni, come la trasformazione di una mesh o l'accensione o lo spegnimento di una luce. In questo caso, definiamo un evento denominato triggered_event inviato in alto nella gerarchia del Scene Graph quando viene attivato un oggetto attivabile. Questo evento è gestito da un componente Scene Graph per determinare se un puzzle è risolto o meno.
Gli eventi di scena richiedono l'API Scene Graph. Per utilizzare l'API Scene Graph, includi /Verse.org/SceneGraph modulo:
Verseusing { /Verse.org/SceneGraph }Aggiungi un evento di scena denominato triggered_event:
Versetriggered_event<public> := class(scene_event):Aggiungi due campi a questo evento, il primo facoltativo che indica l'entità attivata e il secondo una logica che indica se questa entità è stata attivata o meno:
VerseTriggeredEntity:?entity = false Triggered:logic = false
Step successivi
Successivamente, creerai il componente Puzzle per gestire un puzzle e determinare quando viene risolto.
Codice finale per 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."