domingo, 11 de junho de 2023

Referenciando dispositivos criativos em Verse

O Fortnite possui diversos dispositivos criativos (devices) com funcionalidades prontas para serem usados em um jogo.

Eu recomendo conhecerem os dispositivos do módulo Devices no link abaixo da documentação oficial:

Devices module


Neste artigo vamos usar um Timer Device e um End Game Device. O Timer Device fará uma contagem regressiva e quando o tempo acabar ativaremos o End Game Device para encerrar a partida.

A comunicação entre os dispositivos será feita usando código Verse.

Clique no Content Drawer que fica na parte inferior da janela do UEFN. Os dispositivos criativos do Fortnite estão na pasta CollectGame Content > Fortnite > Devices. Selecione esta pasta e pesquise por timer. Arraste o Timer Device e solte no nível: 



As propriedades do Timer Device que foi adicionado ao nível são exibidas na aba Details porque ele está selecionado. Procure a categoria de propriedades User Options e mude as propriedades destacadas na imagem abaixo:



As propriedades alteradas indicam que o nosso Timer Device contará 30 segundos. Ele iniciará automaticamente quando o jogo começar e o jogador não poderá interagir com o Timer Device.

Posicione o Timer Device em cima do Verse Device:



Agora vamos adicionar ao nível o End Game Device. Acesse o Content Drawer e a pasta CollectGame Content > Fortnite > Devices. Pesquise por endgame. Arraste o End Game Device e solte no nível perto do Verse Device. Por padrão, o End Game Device é invisível no jogo. Não será necessário alterar nenhum propriedade do End Game Device.



Agora vamos criar referências para o Timer Device e o End Game Device no código do nosso dispositivo Verse.

Clique no botão Verse da barra de ferramenta para abrir o Visual Studio Code.

Em programação existe o conceito de variável que é um identificador que aponta para um local de memória onde um valor está armazenado. Também temos o conceito de constante que é semelhante a uma variável, só que o seu valor não pode ser modificado durante a execução do programa. A linguagem Verse favorece o uso de constantes mas iremos aprofundar este assunto em outro artigo.  

Adicione duas constantes na classe collect_game_device como mostra o código abaixo. Essas constantes irão referenciar os dispositivos criativos que adicionamos ao nível para podermos gerenciá-los usando código Verse. Não esqueça da indentação (recuo do texto) de 4 espaços para indicar que as constantes pertencem à classe collect_game_device:

collect_game_device := class(creative_device):

    @editable
    TimerDevice : timer_device = timer_device{}

    @editable
    EndGameDevice : end_game_device = end_game_device{}

O @editable acima do nome da constante é um atributo da linguagem Verse. Os atributos iniciam com @ e descrevem comportamentos usados fora do escopo da linguagem Verse. @editable indica que a variável ou constante pode ser modificada direto no UEFN.

A criação de uma constante em Verse usa o seguinte formato:

    Identificador : tipo = inicialização

Na constante do Timer Device, o identificador (ou nome da constante) é TimerDevice, o seu tipo é a classe timer_device e a inicialização é feita usando o construtor timer_device{} que cria uma instância da classe timer_device usando valores padrões.

Observe a diferença de padrão de nomes entre variáveis/constantes e classes.

Os dispositivos criativos usam o conceito de eventos. Quando acabar o tempo do  Timer Device, um evento será gerado. Nós podemos registrar uma função no Timer Device que será executada quando ocorrer o evento. Uma função é um bloco de código parametrizável que pode ser reutilizada em vários locais do código.

Vamos criar uma função que ativará o End Game Device para encerrar a partida. Esta função será registrada no Timer Device para ser executada quando o tempo acabar.

Remova os comentários e as funções Print que vieram no template do código Verse. A função OnBegin e a nova função ficarão assim:

    OnBegin<override>()<suspends>:void=
        TimerDevice.SuccessEvent.Subscribe(HandleTimerFinished)

        
    HandleTimerFinished(MaybeAgent:?agent):void=
        if(Agent := MaybeAgent?):
            EndGameDevice.Activate(Agent)

Não se assuste com a sintaxe da linguagem Verse. Aos poucos você irá se familiarizar com alguns conceitos que te ajudarão a entender tudo que está escrito no código acima.

Por enquanto fique apenas com a ideia geral do que está acontecendo. Ao iniciar o jogo, a função OnBegin é executada. A função OnBegin está com apenas uma instrução no momento que é para registrar a função HandleTimerFinished no evento de sucesso do Timer Device.

A função HandleTimerFinished recebe como parâmetro uma instância do tipo agent que representa o jogador. Se a instância agent for válida, é chamada a função Activate do End Gamer Device para encerrar a partida.

O código deste artigo deve ficar desta forma:

# v0.1
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }


collect_game_device := class(creative_device):

    @editable
    TimerDevice : timer_device = timer_device{}

    @editable
    EndGameDevice : end_game_device = end_game_device{}

    OnBegin<override>()<suspends>:void=
        TimerDevice.SuccessEvent.Subscribe(HandleTimerFinished)

        
    HandleTimerFinished(MaybeAgent:?agent):void=
        if(Agent := MaybeAgent?):
            EndGameDevice.Activate(Agent)


Salve o arquivo e compile o código Verse usando a opção Verse > Build Verse Code do menu do UEFN.

Selecione o collect game device que está no nível. Veja na aba Details que estão aparecendo as propriedades TimerDevice e EndGameDevice. Elas estão aparecendo porque usamos o @editable. Clique no drop-down das propriedades para selecionar os dispositivos que estão no nível:


Salve o nível e inicie a sessão. Observe o Timer Device sendo atualizado. Quando o tempo acabar a partida será encerrada.


Sumário Verse