Este projeto usa vários componentes diferentes do Scene Graph que são acionados por uma ação. Isso inclui ações que são acionadas por um evento:
Transformar uma malha
Alternar a visibilidade de uma malha
Acender ou apagar as luzes
Por exemplo, todas as luzes de esfera na imagem acima são entidades do Scene Graph que têm um componente chamado triggerable_light_component, que é uma classe de componente que implementa a interface triggerable. As diferentes combinações de entidades são acionadas quando o jogador pisa em diferentes bases brancas.
Você pode usar as interfaces em Verse para definir funcionalidades comuns entre objetos ou ações não relacionados. Neste caso, a funcionalidade comum é acionar uma ação, e os objetos ou ações não relacionados são a visibilidade da malha, a transformação da malha e acender ou apagar as luzes.
Para obter mais informações sobre as funcionalidades da linguagem Verse usadas nesta página, consulte:
Defina a interface acionável
Você começará criando um novo arquivo Verse vazio com o nome Triggerable.verse. Você definirá a interface triggerable. Você pode definir a funcionalidade padrão e os valores de campo com interfaces, ou deixar para as classes filhas o papel de definir e implementar. Em seguida, você definirá um evento que será usado para sinalizar se uma entidade do Scene Graph que tem um componente que herda da interface acionável foi acionada.
Este arquivo usa o atributo
@editableem vários campos da interface. Para fazer isso, inclua o módulo /Verse.org/Simulation:Verseusing { /Verse.org/Simulation }Interfaces em Verse são adjetivos, pois descrevem uma ação que as classes filhas implementam. Crie uma nova interface chamada
triggerable:Versetriggerable<public> := interface:Você pode querer rastrear se um objeto acionável foi ou não acionado — por exemplo, se uma luz está acesa ou apagada ou se uma malha está visível ou invisível. É possível que você queira acionar uma ação apenas uma vez. Adicione os seguintes campos lógicos a
triggerablepara rastreá-los:Versevar<protected> Triggered<public>:logic @editable OnlyTriggerOnce<protected>:logic = false var<protected> HasBeenTriggered<protected>:logic = falseObjetos acionáveis são usados como peças nos quebra-cabeças criados mais adiante neste tutorial. Além disso, você pode querer usar objetos acionáveis como peças ilusórias em um quebra-cabeça que são acionados por uma ação, e as peças agem como se fossem parte do quebra-cabeça, mas seu estado acionado não contribui nem atrapalha na solução de um quebra-cabeça. Adicione um campo de lógica
PuzzlePiecepara rastrear se o objeto acionável é ou não uma peça de quebra-cabeça.Verse@editable PuzzlePiece:logic = falsePara ainda mais flexibilidade, você também pode querer um quebra-cabeça em que algumas luzes devem estar acesas e algumas devem estar apagadas para que o quebra-cabeça seja considerado resolvido. Adicione um campo de lógica
SolvedStateTriggeredpara indicar se a peça de quebra-cabeça de objeto acionável é considerada resolvida quando está ou não acionada.Verse@editable SolvedStateTriggered:logic = trueDeclare três funções:
PerformAction,PerformReverseActionePostTrigger. Comotriggerableé uma interface, e a interface não fornece uma implementação base para essas funções, qualquer classe filha detriggerabledeve fornecer a própria implementação de cada uma dessas funções.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():voidDefina três funções adicionais:
Trigger,InSolvedStateeSetInitialTriggeredState. Todas essas três funções têm uma implementação base fornecida na interfacetriggerable.Triggeraciona a ação para o componente que implementa essa interface,InSolvedStatedecide se o componente está em um estado acionado resolvido eSetInitialTriggeredStatedetermina qual é o estado acionado inicial de um componente no início do jogo.Verse# Trigger the appropriate action Trigger():void = if: (OnlyTriggerOnce? and not HasBeenTriggeredOnce?) or (not OnlyTriggerOnce?) then: if (Triggered?): PerformReverseAction() else: PerformAction() PostTrigger()
Defina o evento acionado
Este projeto de quebra-cabeça também usa eventos de cena para enviar eventos para cima ou para baixo na hierarquia do Scene Graph para disparar ações, como transformar uma malha ou acender ou apagar uma luz. Neste caso, definimos um evento chamado trigger_event que é enviado à hierarquia do Scene Graph quando um objeto acionável é acionado. Esse evento é utilizado por um componente do Scene Graph para determinar se um quebra-cabeça foi resolvido ou não.
Os eventos de cena exigem a API do Scene Graph. Para usar a API do Scene Graph, inclua o módulo /Verse.org/SceneGraph:
Verseusing { /Verse.org/SceneGraph }Adicione um evento de cena chamado trigger_event:
Versetriggered_event<public> := class(scene_event):Adicione dois campos a esse evento: o primeiro, opcional, indicando a entidade que é acionada e o segundo, uma lógica indicando se essa entidade foi ou não acionada:
VerseTriggeredEntity:?entity = false Triggered:logic = false
Próximas etapas
Em seguida, você criará o componente de quebra-cabeça para gerenciar um quebra-cabeça e determinar quando ele é resolvido.
Código final para 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."