quinta-feira, 15 de junho de 2023

Armazenando os Item Spawners em um Array

Neste artigo vamos criar um array em nosso dispositivo Verse para armazenar as referências dos Item Spawners que estão no nível. 

Um array é um container que armazena elementos do mesmo tipo. O acesso aos elementos de um array é feito usando um índice.


Adicione a definição do array CoinSpawnerDevices depois da definição do EndGameDevice

    @editable
    var CoinSpawnerDevices : []item_spawner_device = array{}

Estamos usando o @editable para poder fazer um teste com o array neste artigo adicionando um elemento direto no UEFN. Na versão final o @editable poderá ser removido porque vamos preencher o array usando código Verse.

Observe que a linha da definição do array CoinSpawnerDevices começa com var. Isto significa que CoinSpawnerDevices é uma variável e não uma constante. Precisamos usar o var porque CoinSpawnerDevices será modificado posteriormente.

O [] na frente do tipo é o que define que a variável é um array. Este array será usado para armazenar referências do tipo item_spawner_device. O construtor array{} está inicializando o array.

Vamos criar uma função com o nome SpawnCoin que usará um índice aleatório para selecionar um dos Item Spawners que estão armazenados no array para gerar a moeda. 

Para usarmos as funções que geram números aleatórios, precisamos incluir o módulo Random no topo do arquivo:

using { /Verse.org/Random }

Adicione a função SpawnCoin no fim do arquivo. Use a indentação de 4 espaços para que a função pertença à classe collect_game_device:

    SpawnCoin():void=    
        if: 
            IndexSpawner : int = GetRandomInt(0, CoinSpawnerDevices.Length - 1 )
            NextCoinSpawner := CoinSpawnerDevices[IndexSpawner]
        then:
            NextCoinSpawner.SpawnItem()

O tipo de retorno da função SpawnCoin é void que significa que a função não retorna valor. 

Nesta função está sendo usada uma forma diferente da instrução if. Cada linha abaixo do if precisa ser executada com sucesso para que o then seja executado.

As instruções if e then estão sendo usadas para garantir que NextCoinSpawner possui uma referência válida para um Item Spawner.

A função GetRandomInt está sendo usada para gerar um valor inteiro aleatório que usaremos como índice do array para referenciar um dos Item Spawners que estão no nível. O índice do primeiro elemento de um array é 0 e o do último elemento é o tamanho do array menos 1. 

O valor da constante IndexSpawner é usada para acessar a referência do Item Spawner que está no array nesta posição. A referência do Item Spawner é armazenada na constante NextCoinSpawner. Não foi preciso colocar o tipo item_spawner_device entre o : e = porque o compilador consegue inferir o tipo a partir do resultado da expressão.

A classe item_spawner_device possui uma função chamada SpawnItem para gerarmos o item usando código Verse.

Vamos chamar a nossa função SpawnCoin ao iniciar a partida. Adicione a linha SpawnCoin() na função OnBegin

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

O código Verse abaixo mostra como vai ficar a classe collect_game_device com as mudanças deste artigo:

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


collect_game_device := class(creative_device):

    @editable
    TimerDevice : timer_device = timer_device{}

    @editable
    EndGameDevice : end_game_device = end_game_device{}

    @editable
    var CoinSpawnerDevices : []item_spawner_device = array{}

    OnBegin<override>()<suspends>:void=
        TimerDevice.SuccessEvent.Subscribe(HandleTimerFinished)
        SpawnCoin()
        
    HandleTimerFinished(MaybeAgent:?agent):void=
        if(Agent := MaybeAgent?):
            EndGameDevice.Activate(Agent)

    SpawnCoin():void=    
        if: 
            IndexSpawner: int = GetRandomInt(0, CoinSpawnerDevices.Length - 1 )
            NextCoinSpawner := CoinSpawnerDevices[IndexSpawner]
        then:
            NextCoinSpawner.SpawnItem()

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 o array CoinSpawnerDevices. O array aparece no UEFN porque usamos o @editablePara adicionar um item no array, clique no botão +, depois clique no drop-down do Index [ 0 ] e selecione Item Spawner. Esta é a referência do Item Spawner que colocamos no nível.


Salve o nível e inicie a sessão. Observe que irá aparecer uma moeda no Item Spawner que está no nível. Esta moeda foi gerada pelo nosso código Verse. Se já tivéssemos vários Item Spawners no nível, apenas um deles seria escolhido aleatoriamente para gerar a moeda.

Ainda precisamos criar e aplicar uma tag no Item Spawner antes de fazer as outras cópias do Item Spawner. Este será o tópico do próximo artigo.


Sumário Verse