Este proyecto utiliza múltiples componentes de Scene Graph diferentes que se activan mediante una acción. Esto incluye las acciones que se activan con un evento:
Transforma una malla
Activa o desactiva la visibilidad de una malla
Enciende o apaga las luces
Por ejemplo, todas las luces esféricas de la imagen anterior son entidades de Scene Graph que tienen un componente llamado triggerable_light_component, que es una clase de componente que implementa la interfaz que se puede activar. Las diferentes combinaciones de entidades se activan cuando el jugador pisa diferentes pedestales blancos.
Puedes usar las interfaces de Verse para definir funcionalidades comunes entre objetos o acciones no relacionados. En este caso, la funcionalidad común es activar una acción, y los objetos o las acciones no relacionados son la visibilidad de la malla, la transformación de la malla, y el encendido y el apagado de las luces.
Para obtener más información sobre las funciones del lenguaje de Verse utilizadas en esta página, consulta lo siguiente:
Define la interfaz que se puede activar
Comenzarás por crear un nuevo archivo vacío de Verse y llamarlo Triggerable.verse. Definirás la interfaz que se puede activar. Puedes definir la funcionalidad predeterminada y los valores de campo con las interfaces, o dejar que las clases derivadas los definan e implementen. Luego, definirás un evento que se utiliza para señalar si se activó una entidad de Scene Graph que tiene un componente que se hereda de la interfaz que se puede activar.
Este archivo utiliza el atributo
@editableen varios campos de la interfaz. Para ello, incluye el módulo /Verse.org/Simulation :Verseusing { /Verse.org/Simulation }En Verse, las interfaces son adjetivos, ya que describen una acción que implementan las clases derivadas. Crea una nueva interfaz llamada
triggerable:Versetriggerable<public> := interface:Es posible que desees realizar un seguimiento de si un objeto que se puede activar se activó o no; por ejemplo, si una luz está encendida o apagada, o si una malla es visible o invisible. Es posible que solo desees activar una acción una vez. Añade los siguientes campos lógicos a
triggerablepara realizar un seguimiento de estos:Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseLos objetos que se pueden activar se usan como piezas en los rompecabezas que se construirán más adelante en este tutorial. Además, es posible que quieras utilizar objetos que se pueden activar como piezas de señuelo en un rompecabezas que se activan con una acción y las piezas actúan como si fueran parte del rompecabezas, pero su estado activado no contribuye ni quita a la resolución del rompecabezas. Añade un campo lógico de
PuzzlePiecepara realizar un seguimiento de si este objeto que se puede activar es o no una pieza de rompecabezas.Verse@editable PuzzlePiece:logic = falsePara una flexibilidad aún mayor, es posible que desees un rompecabezas en el que algunas luces deban estar encendidas y otras apagadas para que el rompecabezas se considere resuelto. Añade un campo lógico de
SolvedStateTriggeredpara indicar si esta pieza del rompecabezas de objetos que se pueden activar se considera resuelta si se activa o no.Verse@editable SolvedStateTriggered:logic = trueDeclara tres funciones:
PerformAction,PerformReverseActionyPostTrigger. Dado quetriggerablees una interfaz y la interfaz no ofrece una implementación base para estas funciones, cualquier clase derivada detriggerabledebe brindar su propia implementación de cada una de estas funciones.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():voidDefine tres funciones adicionales:
Trigger,InSolvedStateySetInitialTriggeredState. Estas tres funciones tienen una implementación base en la interfaztriggerable.Triggeractiva la acción para el componente que implementa esta interfaz,InSolvedStatedecide si el componente está en un estado activado resuelto, ySetInitialTriggeredStatedetermina cuál es el estado activado inicial de un componente al comenzar la reproducción.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Define el evento activado
Este proyecto de rompecabezas también utiliza eventos de escena para enviar eventos hacia arriba o hacia abajo en la jerarquía del Scene Graph a fin de activar acciones, como transformar una malla o alternar entre encender y apagar una luz. En este caso, definimos un evento llamado trigger_event que se envía a la jerarquía de Scene Graph cuando se activa un objeto que se puede activar. Un componente de Scene Graph gestiona este evento para determinar si se resolvió o no un rompecabezas.
Los eventos de escena requieren la API de Scene Graph. Para usar la API de Scene Graph, incluye el módulo /Verse.org/SceneGraph :
Verseusing { /Verse.org/SceneGraph }Añade un evento de escena llamado trigger_event:
Versetriggered_event<public> := class(scene_event):Añade dos campos a este evento: el primero, un campo opcional que indica la entidad que se activa, y el segundo, un campo lógico que indica si esta entidad se activó o no:
VerseTriggeredEntity:?entity = false Triggered:logic = false
Próximos pasos
A continuación, crearás el Puzzle Component para gestionar un rompecabezas y determinar cuándo se resuelve.
Código final de 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."