Ce projet utilise plusieurs composants Scene Graph différents qui sont déclenchés par une action. Cela inclut les actions déclenchées par un événement :
Activer/désactiver la visibilité d'un maillage
Allumer ou éteindre les lumières
Par exemple, toutes les lumières sphériques de l'image ci-dessus sont des entités Scene Graph avec un composant nommé triggerable_light_component, qui est une classe de composant qui implémente l'interface déclenchable. Les différentes combinaisons d'entités sont déclenchées lorsque le joueur marche sur différents socles blancs.
Vous pouvez utiliser les interfaces Verse pour définir des fonctionnalités communes entre des objets ou des actions non liés. Dans ce cas, la fonctionnalité commune est le déclenchement d'une action et les objets ou actions non liés sont la visibilité du maillage, la transformation du maillage et l'allumage ou l'extinction des lumières.
Pour en savoir plus sur les fonctionnalités du langage Verse utilisées sur cette page, consultez les rubriques suivantes :
Définir une interface déclenchable
Commencez par créer un nouveau fichier Verse vide et nommez-le Triggerable.verse. Définissez l'interface déclenchable. Vous pouvez définir des fonctionnalités par défaut et des valeurs de champ avec des interfaces, ou laisser les classes enfants les définir et les implémenter. Vous définirez ensuite un événement utilisé pour signaler si une entité Scene Graph dotée d'un composant qui hérite de l'interface déclenchable a été déclenchée.
Ce fichier utilise l'attribut
@editablesur divers champs d'interface. Pour ce faire, incluez le module /Verse.org/Simulation :Verseusing { /Verse.org/Simulation }Les interfaces dans Verse sont des adjectifs, car elles décrivent une action que les classes enfants implémentent. Créez une nouvelle interface nommée
triggerable:Versetriggerable<public> := interface:Vous souhaiterez peut-être savoir si un objet déclenchable a été déclenché ou non, par exemple si une lumière est allumée ou éteinte, ou si un maillage est visible ou invisible. Il est possible que vous ne souhaitiez déclencher une action qu'une seule fois. Ajoutez les champs logiques suivants à
triggerablepour en garder une trace :Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseLes objets déclenchables sont utilisés comme clés dans les énigmes créées plus loin dans ce tutoriel. De plus, vous souhaiterez peut-être utiliser des objets déclenchables comme leurres dans une énigme. Ces leurres sont déclenchés par une action et agissent comme s'ils faisaient partie de l'énigme, mais leur état déclenché ne contribue pas à la résolution de l'énigme et n'y ajoute rien. Ajoutez un champ logique
PuzzlePiecepour savoir si cet objet déclenchable est ou non une clé d'énigme.Verse@editable PuzzlePiece:logic = falsePour encore plus de flexibilité, vous pouvez également créer une énigme où certaines lumières doivent être allumées et d'autres éteintes afin que l'énigme soit considérée comme étant résolue. Ajoutez un champ logique
SolvedStateTriggeredpour indiquer si cette clé d'énigme d'objet déclenchable est considérée comme étant résolue si elle est déclenchée ou non.Verse@editable SolvedStateTriggered:logic = trueDéclarez trois fonctions :
PerformAction,PerformReverseActionetPostTrigger. Étant donné quetriggerableest une interface et que l'interface ne fournit pas d'implémentation de base pour ces fonctions, toute classe enfant detriggerabledoit fournir sa propre implémentation de chacune de ces fonctions.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():voidDéfinissez trois fonctions supplémentaires :
Trigger,InSolvedStateetSetInitialTriggeredState. Ces trois fonctions ont toutes une implémentation de base fournie dans l'interfacedéclenchable.Triggerdéclenche l'action pour le composant qui implémente cette interface,InSolvedStatedétermine si le composant est dans un état déclenché résolu etSetInitialTriggeredStatedétermine quel est l'état déclenché initial d'un composant au début de la lecture.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Définir l'événement déclenché
Ce projet d'énigme utilise également des événements de scène pour envoyer des événements vers le haut ou vers le bas de la hiérarchie Scene Graph afin de déclencher des actions, comme la transformation d'un maillage ou l'activation ou la désactivation d'une lumière. Dans ce cas, nous définissons un événement nommé triggered_event qui est envoyé dans la hiérarchie Scene Graph lorsqu'un objet déclenchable est déclenché. Cet événement est géré par un composant Scene Graph pour déterminer si une énigme est résolue ou non.
Les événements de scène nécessitent l'API Scene Graph. Pour utiliser l'API Scene Graph, incluez le module /Verse.org/SceneGraph :
Verseusing { /Verse.org/SceneGraph }Ajoutez un événement de scène nommé triggered_event :
Versetriggered_event<public> := class(scene_event):Ajoutez deux champs à cet événement : le premier, un champ facultatif indiquant l'entité qui est déclenchée, et le second, une logique indiquant si cette entité a été déclenchée ou non :
VerseTriggeredEntity:?entity = false Triggered:logic = false
Étapes suivantes
Ensuite, créez le composant d'énigme pour gérer une énigme et déterminer quand elle est résolue.
Code final pour 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."