Para 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 averiguar cuánto se movió 10 segundos después de aparecer.
Primero, asegúrate de que aún tienes las funciones HurtPlayer()
y CalculateDamage()
en tu archivo Verse. Llamarás a HurtPlayer()
si el jugador no se movió lo suficiente. Como recordatorio, aquí está 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 por causar: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Si la cantidad de daño no eliminaría al jugador, inflige esa cantidad de daño
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Otorga al jugador una oportunidad adicional si su nivel de vida es bajo
return PlayerHealth - MinHealth
else:
# Elimina 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 la transform
del jugador en diferentes 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 con 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 la transform
de un fort_character
. También puede fallar, como indica el []
, así que tiene que estar en un contexto de fallo.
Establece la variable FirstPosition
que creaste antes con el valor que devolvió 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()
Dado que 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 entra then
. Cuando escribas la forma de if
sin el ()
, utiliza then
para el código que debe ejecutarse si todo el código en el bloque de código if
tiene éxito.
Tu primer bloque then
debería verse de la siguiente manera.
then:
Print("¡Muévete o prepárate para recibir daño!")
Sleep(10.0)
Ya viste estas dos funciones antes. Print()
se utiliza aquí para advertir al jugador que necesita moverse. Sleep()
da al jugador 10 segundos para alejarse del punto de aparición antes de que se ejecute el siguiente bloque de código.
Después de una espera de 10 segundos, es momento de ejecutar el código que comprobará si el jugador está a cierta distancia de su punto de aparición, y si no, 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
, excepto que ahora estableces SecondPosition
en lugar de FirstPosition
. Ahora tienes dos ubicaciones para comparar.
A continuación, declara e inicializa DistanceBetweenPositions
. Para obtener esto, utilizarás una función integrada en Verse llamada DistanceXY()
. Toma dos argumentos que son coordenadas en el espacio 3D y se llaman vectores. Solo utiliza las coordenadas X e Y para medir la distancia, y devuelve esa distancia como un float
. Recuerda utilizar solo la propiedad Translation
de las dos variables transform
.
Por último, compara la DistanceBetweenPositions
con un valor literal float
. Es una buena idea empezar con un número grande para asegurarte de que tu código funciona. Redúcelo a medida que calculas una distancia razonable para moverte en el tiempo dado.
El siguiente bloque then
se ejecutará si los jugadores no se mueven la distancia requerida dentro del límite de tiempo. Entonces, quieres que este sea el código que dañe al jugador.
then:
Print("Distancia recorrida: {DistanceBetweenPositions}")
Print("Aplicando daño")
HurtPlayer(50.0)
Esto imprimirá: la distancia real que el jugador se movió, una notificación de que el daño está a punto de aplicarse y una llamada a la función HurtPlayer()
que escribiste antes. Si llamas 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 el dispositivo se inicia 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 recibir daño!")
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 por causar: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Si la cantidad de daño no eliminaría al jugador, inflige esa cantidad de daño
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Otorga al jugador una oportunidad adicional si su nivel de vida es bajo
return PlayerHealth - MinHealth
else:
# Elimina al jugador
return PlayerHealth
Próximos pasos
Ahora que conoces los aspectos básicos, ya puedes usar Verse para crear tu propio dispositivo en Unreal Editor para Fortnite. Consulta la siguiente guía para saber más.