Este proyecto utiliza varios componentes diferentes de Scene Graph que se activan mediante una acción. Esto incluye acciones activadas por un evento:
Transformación de una malla
Activación/desactivación de la visibilidad de una malla
Encendido o apagado de 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 activable. Las distintas combinaciones de entidades se activan cuando el jugador pisa distintos pedestales blancos.
Puedes utilizar las interfaces de Verse para definir la función común entre objetos o acciones no relacionados. En este caso, lo común es activar una acción y los objetos o acciones no relacionados son la visibilidad de la malla, la transformación de la malla y el encendido o apagado de las luces.
Para obtener más información sobre las funciones del lenguaje Verse utilizadas en esta página, consulta:
Cómo definir una interfaz activable
Empezarás creando un nuevo archivo de Verse vacío llamado Triggerable.verse. Vas a definir la interfaz activable. Puedes definir la función predeterminada y los valores de campo con interfaces, o dejar que las clases hijo los definan e implementen. A continuación, definirás un evento que se utiliza para señalar si se ha activado una entidad de Scene Graph que tiene un componente que hereda de la interfaz.
Este archivo utiliza el atributo
@editableen varios campos de la interfaz. Para ello, incluye el módulo /Verse.org/Simulation :Verseusing { /Verse.org/Simulation }Las interfaces en Verse son adjetivos, ya que describen una acción que implementan las clases hijo. Crea una nueva interfaz nombrada
triggerable:Versetriggerable<public> := interface:Puede que quieras hacer un seguimiento de si un objeto activable se ha activado o no; por ejemplo, si una luz está encendida o apagada, o si una malla es visible o invisible. Es posible que solo quieras activar una acción una vez. Añade los siguientes campos lógicos a
triggerablepara hacerles un seguimiento:Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseLos objetos activables se usan como piezas en los rompecabezas que se construirán más adelante en este tutorial. Además, puede que quieras utilizar objetos activables como piezas 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 resta valor a la resolución del rompecabezas. Añade un campo lógico
PuzzlePiecepara hacer un seguimiento de si este objeto activable es o no una pieza del rompecabezas.Verse@editable PuzzlePiece:logic = falsePara tener más flexibilidad, también te puede interesar 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
SolvedStateTriggeredpara indicar si esta pieza del rompecabezas de objetos activables se considera resuelta si se activa o no.Verse@editable SolvedStateTriggered:logic = trueDeclara tres funciones:
PerformAction,PerformReverseActionyPostTrigger. Comotriggerablees una interfaz y la interfaz no proporciona una implementación base para estas funciones, cualquier clase hijo detriggerabledebe proporcionar 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:
triggers,InSolvedStateySetInitialTriggeredState. Estas tres funciones tienen una implementación base proporcionada en la interfazactivable.Triggeractiva la acción para el componente que implementa esta interfaz,InSolvedStatedecide si el componente se encuentra en un estado activado resuelto ySetInitialTriggeredStatedetermina cuál es el estado activado inicial de un componente al empezar a reproducirse.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Cómo definir un evento activado
Este proyecto de rompecabezas también utiliza eventos de escena para enviar eventos hacia arriba o hacia abajo en la jerarquía de Scene Graph para desencadenar acciones, como transformar una malla o encender o apagar una luz. En este caso, definimos un evento llamado triggered_event que se envía hacia arriba en la jerarquía de Scene Graph cuando se activa un objeto activable. Este evento lo gestiona un componente de Scene Graph para determinar si se resuelve o no un rompecabezas.
Los eventos de escena requieren la API de Scene Graph. Para utilizar la API de Scene Graph, incluye el módulo /Verse.org/SceneGraph :
Verseusing { /Verse.org/SceneGraph }Añade un evento de escena denominado 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 ha activado o no:
VerseTriggeredEntity:?entity = false Triggered:logic = false
Siguientes pasos
A continuación, crearás el componente de rompecabezas para gestionar un rompecabezas y determinar cuándo está resuelto.
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."