En este ejercicio, tu objetivo es dañar al jugador si no se mueve a cierta distancia de su plataforma de aparición en un tiempo definido. Utilizarás expresiones falibles y contextos de fallo para obtener información sobre la ubicación del jugador, y para averiguar lo lejos que se ha movido diez segundos después de aparecer.
Primero, comprueba que sigues teniendo las funciones HurtPlayer()
y CalculateDamage()
en tu archivo de Verse. Vas a llamar a HurtPlayer()
si el jugador no se ha alejado lo suficiente. A modo de recordatorio, aquí tienes el código de esas funciones.
HurtPlayer(DamageAmount:float):void=
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
if (Player:player = AllPlayers[0]):
if (FortniteCharacter:fort_character = Player.GetFortCharacter[]):
MyCharacterHealth:float = FortniteCharacter.GetHealth()
DamageToDo:float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Daño para hacer: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Si la cantidad de daño no elimina al jugador, haz esa cantidad de daño
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dar al jugador una oportunidad más si su salud es baja
return PlayerHealth - MinHealth
else:
# Eliminar al jugador
return PlayerHealth
Ahora, tendrás que conseguir todos los objetos player
del nivel (en este caso solo uno, ¡tú!). También crearás dos variables para almacenar el objeto transform
del jugador en distintos momentos. Una transformación contiene datos sobre la ubicación, rotación y escala de un objeto. Para este ejercicio, solo necesitas la ubicación, pero se almacena en el objeto transform
.
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
Es hora de crear un par de contextos de fallo utilizando if
. Las dos primeras líneas de abajo obtienen el objeto fort_character
del objeto player
. Si este código te resulta familiar, es porque es casi igual que parte del código de la función HurtPlayer()
. Tienes que escribirlo de nuevo aquí porque también lo necesitas para obtener el objeto transform
de un fort_character
. También puede fallar, como indica el []
, por lo que tiene que estar en un contexto de fallo.
Establece la variable FirstPosition
que creaste antes con el valor devuelto por FortniteCharacter.GetTransform()
. Esta expresión no es falible, pero si alguna de las dos expresiones anteriores falla, no querrás ejecutar esta expresión, por lo que está en el mismo contexto de fallo.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
Como todas tus expresiones falibles están en el bloque de código if
, necesitas un nuevo bloque de código para el código que quieres ejecutar si tienen éxito. Ahí es donde then
entra en juego. Cuando escribas la forma de if
sin el ()
, utiliza then
para el código que debe ejecutarse si todo el código del bloque de código if
tiene éxito.
Tu primer bloque then
debería tener el siguiente aspecto:
then:
Print("¡Muévete o prepárate para sufrir!")
Sleep(10.0)
Ya has visto antes estas dos funciones. Print()
se utiliza aquí para avisar al jugador de que tiene que moverse. La función Sleep()
da al jugador diez segundos para alejarse del punto de aparición antes de que se ejecute el siguiente bloque de código.
Tras una espera de diez segundos, es hora de ejecutar el código que comprobará si el jugador se encuentra a cierta distancia de su punto de aparición y, si no es así, lo dañará.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
Las tres primeras líneas son casi iguales que el primer bloque de código if
, salvo que ahora estás configurando SecondPosition
en lugar de FirstPosition
. Ahora tienes dos ubicaciones para comparar.
A continuación, declara e inicializa DistanceBetweenPositions
. Para conseguirlo, utilizarás una función integrada de Verse llamada DistanceXY()
. Toma dos argumentos, ambos coordenadas en el espacio 3D llamados vectores. Solo utiliza las coordenadas X e Y para medir la distancia, y devuelve esa distancia como un float
. Recuerda que solo debes utilizar la propiedad Translation
de las dos variables transform
.
Por último, compara DistanceBetweenPositions
con un valor literal float
. Es buena idea empezar con un número grande para asegurarte de que tu código funciona. Redúcelo a medida que calcules una distancia razonable para moverte en el tiempo dado.
Tu siguiente bloque then
se ejecutará si los jugadores no se mueven la distancia requerida dentro del tiempo límite. Así que quieres que este sea el código que daña al jugador.
then:
Print("Distancia recorrida: {DistanceBetweenPositions}")
Print("Aplicando daño")
HurtPlayer(50.0)
Esto imprimirá la distancia real que se movió el jugador, una notificación de que el daño está a punto de aplicarse y una llamada a la función HurtPlayer()
que escribiste antes. Al llamar a la función HurtPlayer()
, no tienes que pensar en cómo se implementa. Sabes que seguirá las reglas que estableciste antes para dañar al jugador.
Secuencia de comandos completa
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /UnrealEngine.com/Temporary/SpatialMath }
hello_world_device := class(creative_device):
# Se ejecuta cuando se inicia el dispositivo en un juego en ejecución
OnBegin<override>()<suspends>:void=
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
then:
Print("¡Muévete o prepárate para sufrir!")
Sleep(10.0)
if:
Player : player = AllPlayers[0]
FortniteCharacter : fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions: float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
then:
Print("Distancia recorrida: {DistanceBetweenPositions}")
Print("Aplicando daño")
HurtPlayer(50.0)
# Funciones de lecciones anteriores
#################################
HurtPlayer(DamageAmount : float):void=
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (Player : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = Player.GetFortCharacter[]):
MyCharacterHealth : float = FortniteCharacter.GetHealth()
DamageToDo : float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Daño para hacer: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Si la cantidad de daño no elimina al jugador, haz esa cantidad de daño
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dar al jugador una oportunidad más si su salud es baja
return PlayerHealth - MinHealth
else:
# Eliminar al jugador
return PlayerHealth
Siguientes pasos
Ahora que ya sabes lo básico, ¡estás listo para usar Verse para crear tu propio dispositivo en Unreal Editor para Fortnite! Consulta la siguiente guía para saber cómo hacerlo.