En este tutorial, se utiliza Verse para que determinadas características funcionen. Al utilizar Verse en este tutorial, puedes hacer lo siguiente:
Activar y reproducir animaciones de forma intermitente para crear una mecánica de juego.
Actualizar la información de puntuación del jugador para todos los jugadores de un minijuego.
Crear retrasos en la aparición de jugadores y tiempos de aparición de elementos intermitentes.
Puedes reutilizar este código para realizar las siguientes tareas:
Cambiar los dispositivos que están habilitados y deshabilitados mientras el juego hace la transición del HUB al juego y de vuelta al HUB.
Verificar las puntuaciones de los jugadores para encontrar la puntuación ganadora y mostrarla en el HUB.
Terminar el juego y teletransportar a los jugadores de vuelta al HUB al final del minijuego.
Cómo configurar el dispositivo de Verse y los objetos editables
Sigue estos pasos para configurar el dispositivo de Verse y los objetos editables:
Crea un nuevo dispositivo de Verse llamado
tiltnboomy añádelo al nivel. Consulta Cómo crear tu propio dispositivo con Verse para conocer los pasos.Añade los siguientes módulos de en la parte superior del archivo:
Verseusing { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Random } using { /Verse.org/Simulation }Añade los siguientes campos a la definición de la clase
tiltnboom:Dos dispositivos
triggereditables; ActivateGameTrigger y EndGameTrigger.ActivateGameTriggerse usa para activar este juego. El activador se puede activar mediante cualquier elemento, como un teletransportador al juego, o después de una cinemática de introducción.El
EndGameTriggerse utiliza para finalizar el minijuego y eliminar todos los dispositivos de cámara y control de los jugadores una vez finalizada la partida.
Verse@editable ActivateGameTrigger:trigger_device = trigger_device{} @editable EndGameTrigger:trigger_device = trigger_device{}Un dispositivo temporizador editable llamado GameTimer. Esto termina el juego después de una cierta cantidad de tiempo.
Un
arrayde dispositivos de secuencia cinemática llamadosCannonballSequences. Cada dispositivo de la matriz reproduce una posición de aterrizaje de bala de cañón diferente.Una matriz de volúmenes de daño llamada DamageVolumes que se habilitan y deshabilitan en función del estado del juego.
Una matriz de generadores de elementos llamada ItemSpawners que genera aleatoriamente una cantidad aleatoria de elementos durante el juego.
Un dispositivo de área de captura llamado CaptureArea. Esto otorga puntos a los jugadores por estar en la balsa, y se habilita o deshabilita en función del estado del juego.
Un dispositivo gestor de puntuaciones llamado
ScoreManager, que restablece la puntuación de los jugadores cuando empieza una partida y determina el jugador ganador al final de la partida.Un teletransportador llamado
HUBTeleporterque devuelve a todo el mundo al HUB una vez finalizada la partida.Un dispositivo de referencia de jugadores llamado PlayerReference, que muestra al jugador ganador en el HUB entre partidas.
Verse@editable GameTimer:timer_device = timer_device{} @editable CannonballSequences:[]cinematic_sequence_device = array{} @editable DamageVolumes:[]damage_volume_device = array{} @editable
Dos matrices editables de plataformas de aparición de jugadores llamadas
PlayerSpawnersyHUBSpawners. Deshabilitan la aparición cuando termina el minijuego y devuelven a los jugadores al HUB después del minijuego.Verse@editable PlayerSpawners:[]player_spawner_device = array{} @editable HUBSpawners:[]player_spawner_device = array{}Dos
floatseditables llamadosMinimumItemSpawnTimeyMaximumItemSpawnTime. Estos son los tiempos mínimo y máximo de espera entre la aparición de elementos en la balsa.Verse@editable MinimumItemSpawnTime:float = 5.0 @editable MaximumItemSpawnTime:float = 10.0Un
floateditable llamadoDelayAfterGame. Este es el retraso para teletransportar a los jugadores de vuelta al HUB una vez que el juego terminó.Verse@editable DelayAfterGame:float = 5.0Un
floatllamadoDelayBetweenCannonballSequences. Este es el retraso para la aparición de balas de cañón entre secuencias durante todo el minijuego.VerseDelayBetweenCannonballSequences:float = 8.0Una variable lógica llamada
GameActivepara determinar si el juego está activo o no.Versevar GameActive:logic = false
Cómo comenzar el juego
Cuando comienza el minijuego, se habilitan varios dispositivos, y la puntuación del jugador se reinicia a 0.
Encima de la definición de la clase
tiltnboom, añade un canal de registro para imprimir mensajes específicos del minijuego. A continuación, añade un registrador a la definición de la clase para utilizarlo con el canal de registro.Versetiltnboom_log_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level tiltnboom := class(creative_device): Logger:log = log{Channel := tiltnboom_log_channel}Añade un nuevo método
OnTriggereda la definición de la clasetitnboomque tome unInitiatingAgenty comience el juego. Añade una expresión if al método que devuelva si el juego ya está activo, ya que no conviene iniciar el juego mientras ya se está ejecutando uno.VerseOnTriggered(InitiatingAgent:?agent):void= if (GameActive?): return spawn{StartGame()}En
OnBegin(), suscribe elTriggeredEventdel ActivateGameTrigger a la funciónOnTriggeredpara iniciar el juego. Cualquier dispositivo que necesite habilitarse al principio del minijuego se suscribirá a este evento y se habilitará cuando se active el evento OnTrigger.VerseOnBegin<override>()<suspends>:void= ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)Añade un nuevo método
StartGame()que maneje la lógica para iniciar el juego. Añade el modificador<suspends>a esta función para que se pueda ejecutar de forma asíncrona.En primer lugar, establece el
GameActiveentruepara indicar que el juego está activo. A continuación, habilita elCaptureAreay cadaDamageVolumeen la matrizDamageVolumes.Para cada jugador, si tiene una puntuación superior a 0, restablece su puntuación otorgándole la inversa de su puntuación actual, lo que establece su puntuación en 0.
Luego, en una expresión de carrera, una carrera entre el temporizador que termina, la secuencia de la bala de cañón en ejecución y los elementos aleatorios que aparecen. La secuencia de la bala de cañón y los elementos aleatorios que aparecen son bucles infinitos, pero se cancelan tan pronto como el temporizador finaliza.
Cuando el juego termina, llama a la función
OnGameFinished()para que se encargue de la limpieza al final del juego.VerseStartGame()<suspends>:void= Logger.Print("Starting game.") set GameActive = true CaptureArea.Enable() for (DamageVolume : DamageVolumes): DamageVolume.Enable() for:
Cómo crear un bucle de bala de cañón
En esta sección, se explica cómo añadir una función que reproduzca las secuencias cinemáticas de la bala de cañón.
Añade un nuevo método
StartCannonSequence()a la definición de la clasetiltnboomque reproduzca las secuencias de niveles de balas de cañón y utiliza un bucle para reproducir la expresión de retraso e insertar un retraso entre las balas de cañón. Añade el modificador<suspends>a esta función para que se pueda ejecutar de forma asíncrona.En un bucle, elige una secuencia aleatoria en la matriz
CannonballSequencesindexándola conGetRandomInt(). Reproduce la secuencia; luego, espera un tiempoDelayBetweenCannonballSequencesantes de reproducir otra secuencia.VerseStartCannonSequence()<suspends>:void= loop: RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1) if (CannonballSequence := CannonballSequences[RandomCannonballSequence]): Logger.Print("Set CannonballSequence to {RandomCannonballSequence}") CannonballSequence.Play()
Cómo crear bucles de generación aleatoria de elementos
En esta sección, se explica cómo crear una función que genere elementos aleatorios en lugares aleatorios de la balsa, lo que puede ayudar o perjudicar a los jugadores para ganar el minijuego.
Añade un nuevo método llamado
SpawnRandomItemsa la definición de clasetitlnboom. Con este método, se controlan los elementos que aparecen en la balsa.Obtén la cantidad de elementos en la matriz
ItemSpawners; luego, haz un bucle que recorra toda la matriz. Usa unintaleatorio para obtener un generador de elementos aleatorio de la matriz; luego, actívalo. Permanece inactivo durante una cantidad aleatoria de tiempo entre los elementos generados.El bucle decide aleatoriamente cuántos elementos generar, y selecciona aleatoriamente un elemento para generar, tantas veces como
NumberOfItemsToSpawn. ElDelayBetweenItemSpawnsgenera una cantidad indeterminada de tiempo de espera entre cada aparición.VerseSpawnRandomItems()<suspends>:void= ItemSpawnerCount:int = ItemSpawners.Length - 1 loop: NumberOfItemsToSpawn:int = GetRandomInt(0, ItemSpawnerCount) # Spawn a randomly selected item, as many times as NumberOfItemsToSpawn. for: CurrentItemSpawnNumber := 0..NumberOfItemsToSpawn
Cómo finalizar el juego
Al final del minijuego, tendrás que enviar la puntuación del ganador al HUB, desactivar los dispositivos y teletransportar a los jugadores de vuelta al HUB.
Añade un nuevo método
OnGameFinisheda la definición de clasetiltnboom. Cuando el juego termina, con esta función, el juego se establece en inactivo y se deshabilitan los dispositivos relevantes.~~~(verse) OnGameFinished()<suspends>:void= Logger.Print("Terminó el juego.") set GameActive = false
CaptureArea.Disable()
for (PlayerSpawner : PlayerSpawners): PlayerSpawner.Disable()
for (DamageVolume : DamageVolumes): DamageVolume.Disable() ~~~
Añade la
variable intHighestScorepara rastrear al jugador con la puntuación más alta, y una variable de opción de referencia a ese jugadorWinningPlayer.Versevar HighestScore:int = -1 var WinningPlayer:?agent = falseEn una expresión for/do, obtén todos los jugadores en el espacio de juego; luego, obtén el
FortCharacterde cada uno de ellos. Congela al personaje en su lugar mediantePutInStasis(), con un nuevo conjunto destasis_argspara permitir que emita y gire a fin de que los jugadores puedan celebrar el juego.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})En una expresión
if, comprueba la puntuación de cada jugador para encontrar y almacenar la puntuación ganadora en el dispositivo de referencia del jugador en el HUB.Verseif (ScoreManager.GetCurrentScore(Player) > HighestScore): set HighestScore = ScoreManager.GetCurrentScore(Player) set WinningPlayer = option{Player}Por último, en otra expresión if, llama a
TeleportPlayersToHUB()para teletransportar a todos de vuelta al HUB cuando se encuentre una puntuación ganadora.Verseif(Winner := WinningPlayer?): PlayerReference.Register(Winner) TeleportPlayersToHUB()
Cómo teletransportar jugadores de vuelta al HUB
Una vez calculadas las puntuaciones y declarado el ganador, todos los jugadores deben teletransportarse de vuelta al HUB.
Añade un nuevo método
TeleportPlayersToHUB()a la definición de clase tiltnboom. Con este método, se habilitan todos los generadores de jugadores en el HUB; luego, espera unos segundos antes de teletransportar a todos de vuelta al HUB. Con este método, también se debería activar elEndGameTriggerpara eliminar la cámara y los dispositivos de control de jugadores.VerseTeleportPlayersToHUB()<suspends>:void= for (HUBSpawner : HUBSpawners): HUBSpawner.Enable() Sleep(DelayAfterGame) EndGameTrigger.Trigger()En una expresión
for, teletransporta a cada jugador de vuelta alHUBTeleportery libéralos de estasis.Versefor: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: HUBTeleporter.Teleport(Player) Sleep(1.0) FortCharacter.ReleaseFromStasis()
Hazlo por tu cuenta
Modifica este código para crear diferentes tareas que realizará el dispositivo temporizador. En lugar de determinar la duración de un minijuego, puedes utilizar el dispositivo temporizador para cronometrar una carrera.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
tiltnboom_log_channel := class(log_channel){}
# A Verse-authored creative device that can be placed in a level