Uma interface é um tipo composto, assim como a classe, que é usada para especificar o que uma classe pode fazer sem especificar como será feito. Vamos analisar o exemplo abaixo de interface.
challengeable := interface:
IsChallengeCompleted():logic
Este código define a interface challengeable que possui a função IsChallengeCompleted(). Observe que a função não tem corpo, pois ela tem de ser implementada pela classe que implementar a interface. Este exemplo possui apenas uma função, mas a interface pode ter quantos funções forem necessárias.
O uso de interface permite a criação de um tipo de protocolo ou contrato que pode ser seguido por diversas classes de diferentes tipos. Em alguma parte do código do projeto nós podemos lidar com objetos que implementam a interface challengeable sem precisar saber do tipo real da classe.
Em Verse, a implementação de uma interface é feita da mesma forma que a herança de classe. Uma classe Verse só pode ter uma classe pai, mas pode herdar (implementar) diversas interfaces.
No código abaixo, a classe trigger_manager_device herda da classe creative_device e implementa a interface challengeable. Ela precisa sobrescrever a função IsChallengeCompleted da interface.
trigger_manager_device := class(creative_device, challengeable):
var IsAllTriggersActivated : logic = false
IsChallengeCompleted<override>():logic=
IsAllTriggersActivated
...
Cada classe que implementar a interface challengeable terá suas próprias regras para definir o resultado da função IsChallengeCompleted(). A classe acima considera que completou o desafio (challenge) quando todas as triggers forem ativadas. Podemos ter outra classe que faz algum tipo de puzzle usando botões.
O tipo da interface pode ser usada na conversão de tipo de referências de objetos, também conhecido como type cast. Por exemplo, CreativeDevice é uma referência do tipo creative_device e por isso pode apontar para uma instância de qualquer subclasse de creative_device.
O código abaixo testa se a referência CreativeDevice aponta para uma instância de uma classe que implementa a interface challengeable. Se o cast funcionar, ChallengeableDevice armazenará uma referência do tipo challengeable.
if( ChallengeableDevice := challengeable[ CreativeDevice ] ):
IsChallengeCompleted := ChallengeableDevice.IsChallengeCompleted()
...
Vamos fazer um exemplo para ilustrar o uso da interface com o dispositivo trigger_manager_device que implementa a interface challengeable.
Este dispositivo terá 3 trigger_device. Quando todas as trigger_device forem ativadas, a variável IsAllTriggersActivated recebe o valor true. O valor desta variável é retornada na função IsChallengeCompleted().
Abra o Verse Explorer, clique com o botão-direito no nome do projeto e escolha a opção Add new Verse file to project.
Em Device Name coloque trigger_manager_device e clique no botão Create Empty.
Vamos criar a interface challengeable neste mesmo arquivo. Copie o código Verse abaixo para o arquivo trigger_manager_device:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
challengeable := interface:
IsChallengeCompleted():logic
trigger_manager_device := class(creative_device, challengeable):
var IsAllTriggersActivated : logic = false
@editable
Trigger1 : trigger_device = trigger_device{}
@editable
Trigger2 : trigger_device = trigger_device{}
@editable
Trigger3 : trigger_device = trigger_device{}
OnBegin<override>()<suspends>:void=
sync:
Trigger1.TriggeredEvent.Await()
Trigger2.TriggeredEvent.Await()
Trigger3.TriggeredEvent.Await()
set IsAllTriggersActivated = true
IsChallengeCompleted<override>():logic=
IsAllTriggersActivated
Na função OnBegin é usado a expressão sync para aguardar até que todas as triggers sejam ativadas.
Salve o arquivo e compile o código Verse usando a opção Verse > Compile Verse Code do menu do UEFN.
Vamos criar outro dispositivo que usará a função IsChallengeCompleted() da interface challengeable para verificar se o desafio foi concluído e ativar o end_game_device.
No Verse Explorer, clique com o botão-direito no nome do projeto e escolha a opção Add new Verse file to project.
Em Device Name coloque interface_device e clique no botão Create Empty.
Copie o código Verse abaixo para o dispositivo interface_device:
using { /Fortnite.com/Devices }
using { /Fortnite.com/Playspaces }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
interface_device := class(creative_device):
@editable
CreativeDevice : creative_device = creative_device{}
@editable
EndGameDevice : end_game_device = end_game_device{}
OnBegin<override>()<suspends>:void=
if( ChallengeableDevice := challengeable[ CreativeDevice ] ):
loop:
IsChallengeCompleted := ChallengeableDevice.IsChallengeCompleted()
if:
IsChallengeCompleted?
PlayerAgent := GetPlayspace().GetPlayers()[0]
then:
EndGameDevice.Activate(PlayerAgent)
break #end loop
Sleep(0.5)
else:
Print("O dispositivo não implementa a interface challengeable!")
Estamos usando uma referência para creative_device que é a classe pai dos dispositivos criativos. Então este exemplo vai funcionar para qualquer tipo de dispositivo que implemente a interface challengeable.
Na função OnBegin() é verificado se temos uma instância que implementa a interface challengeable. Depois é iniciado um loop que verifica a cada 0,5 segundos se o desafio foi concluído.
Salve o arquivo e compile o código Verse usando a opção Verse > Compile Verse Code do menu do UEFN.
Acesse o Content Drawer e adicione os dispositivos trigger_manager_device e interface_device ao nível.
Adicione um End Game Device e três Trigger Device no nível. A imagem abaixo mostra os dispositivos usados neste exemplo.
Selecione o trigger_manager_device no nível. Na aba Details, selecione as 3 instâncias de Trigger Device.
Selecione o interface_device no nível. Na aba Details adicione as referências do trigger manager device e do End Game Device.
Salve o nível e clique no botão Launch Session para carregar o nível no Fortnite. Após ativar as 3 triggers, o interface_device detectará que o desafio foi concluído e ativará o fim da partida.


