El comportamiento básico del minijuego se define en el dispositivo Verse verse_commander_minigame. Este dispositivo inicia el minijuego, gestiona la comunicación entre la IU y el personaje, y ejecuta los tableros utilizados en el juego.
Este dispositivo tiene los siguientes campos que puedes modificar en el editor:
HUDController: dispositivo Controlador del HUD para eliminar todos los elementos predeterminados del HUD de Fortnite.
PlayVerseCommanderButton: dispositivo Botón que inicia el minijuego.
NPCSpawner: dispositivo Generador de PNJ para poder crear el personaje del minijuego.
Gameboards: lista de tableros para el juego. Los tableros se juegan en el orden en que aparecen en la lista.
UICommandLimit: límite máximo de órdenes que se pueden poner en cola en la parte inferior de la lista.
El dispositivo también incluye eventos personalizados para comunicarse con el personaje y pasarle información: la lista de las órdenes que debe ejecutar el personaje y la transformación a la que debe teletransportarse el personaje cuando se reinicie el tablero.
# A Verse-authored creative device that can be placed in a level
verse_commander_minigame := class(creative_device):
# The HUD Controller device for the minigame.
@editable
HUDController<private>:hud_controller_device = hud_controller_device{}
# The button that starts the minigame.
@editable
PlayVerseCommanderButton:button_device = button_device{}
Cómo iniciar el minijuego
El dispositivo **verse commander minigame** espera a que el jugador interactúe con el dispositivo Botón del ordenador antes de iniciar el minijuego para todos los jugadores. Esta espera está en bucle. Cuando hayas terminado todos los niveles, puedes repetir el minijuego tantas veces como quieras.
# Runs when the device is started in a running game.
OnBegin<override>()<suspends>:void=
spawn{Cinematic.EnterCinematicModeForAll(GetPlayspace().GetPlayers())}
loop:
PlayVerseCommanderButton.InteractedWithEvent.Await()
Setup()
# Wait for all Gameboards to be set up.
Sleep(2.0)
Bucle del juego
El bucle del juego comienza obteniendo el tablero actual. Si es la primera vez que un jugador está en este tablero, el personaje se teletransporta a la posición inicial del tablero, que cambia a su cámara y reproduce su cinemática de apertura.
A continuación, hay una carrera entre el bucle del nivel y la espera del evento de restablecimiento de la IU. Si alguno de ellos acaba primero, anula al otro. A continuación, las expresiones del bucle se repiten y vuelven a obtener el tablero actual e inician de nuevo la carrera.
# Loops over the current gameboard and resets them.
GameLoop<private>()<suspends>:void=
# For the current board, swap to that gameboard's camera and reset the character to the gameboard's starting position.
loop:
if:
Gameboard := Gameboards[CurrentBoard]
then:
# If first time on this board, set up the board
# and move character to starting position.
if:
LevelLoop
La función LevelLoop() gestiona la lógica del tablero. Hay una carrera entre el bucle de órdenes para el personaje y la espera de que se alcance el objetivo final del tablero. Una vez alcanzado el objetivo final, se cancela el bucle de órdenes y se llama al siguiente tablero de la lista.
El bucle de órdenes espera a que el jugador pulse el botón Ejecutar para recibir la lista de órdenes que debe realizar. Los botones están desactivados, excepto el botón Reiniciar. El personaje recibe una señal para ejecutar las órdenes y el dispositivo de Verse espera a recibir la señal de finalización antes de reiniciar el bucle y esperar más órdenes.
Se utiliza un especificador defer en este bucle para limpiar la IU si se cancela el bucle de órdenes o la función LevelLoop(). La expresión de aplazamiento llamará a ResetUIForAllPlayers() justo antes de salir del ámbito para restablecer la interactividad de los botones de modo que vuelvan a estar activados y borrar la lista de órdenes de la parte inferior.
# Handles command logic for the current gameboard.
LevelLoop<private>(Gameboard:gameboard)<suspends>:void=
# On the current board, race between completing the board and looping player commands.
# The race expression will cancel whichever action doesn't finish first.
race:
loop:
defer:
# If the loop is canceled because the character reached the end goal of the level,
# Or the character finished performing their commands,
# reset the UI for all the players so they can interact with it and have no commands in the queue.
Cómo reiniciar el juego
La función AwaitReset() espera a que el jugador seleccione el botón Reiniciar. Cuando lo hace, el tablero se reinicia y le dice al personaje que se teletransporte a la posición inicial en el tablero.
# Waits for the Reset button to be selected, then resets the current gameboard
# and NPC.
AwaitReset<private>(Gameboard:gameboard)<suspends>:void=
ResetButtonSelected.Await()
# Reset the current gameboard, returning the game character to the starting position and
# resetting any barriers or triggers on the board.
BoardResetEvent.Signal(Gameboard.GetStartingCharacterPosition())
# Reset Gameboard
Siguiente paso
Cubre la funcionalidad principal del dispositivo de Verse para el minijuego. Puedes encontrar la lista completa del código para crear el dispositivo Minijuego Verse Commander en el siguiente y último paso.