In questo esercizio, il tuo obiettivo è di arrecare danni al giocatore se non si sposta di una certa distanza dalla sua pedana di generazione entro un tempo definito. Per farlo, utilizza espressioni fallibili e contesti di errore per ottenere informazioni sulla posizione del giocatore e capire quanto si è allontanato 10 secondi dopo la generazione.
Innanzitutto, assicurati di avere ancora le funzioni HurtPlayer() e CalculateDamage() nel tuo file Verse. Chiamerai la funzione HurtPlayer() se il giocatore non si è spostato abbastanza. Come promemoria, ecco il codice di queste funzioni:
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("Danni da infliggere: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Se la quantità di danni non elimina il giocatore, infliggi quella quantità
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dà al giocatore un'altra possibilità se la sua salute è bassa
return PlayerHealth - MinHealth
else:
# Elimina il giocatore
return PlayerHealth
Ora, devi ottenere tutti gli oggetti player nel livello (in questo caso solo uno: tu!). Devi anche creare due variabili per memorizzare la trasformazione (transform) del giocatore in momenti diversi. La trasformazione include dati sulla posizione, rotazione e scala di un oggetto. In questo esercizio, avrai bisogno solo delle informazioni sulla posizione memorizzate nell'oggetto transform.
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
È ora di creare una coppia di contesti di errore utilizzando if. Le prime due righe qui sotto ottengono l'oggetto fort_character dall'oggetto player. Se questo codice ti sembra familiare, è perché è quasi identico a parte del codice della funzione HurtPlayer(). Devi scriverlo di nuovo qui perché ti serve anche per ottenere il valore transform di un ‘fort_character'. Può anche non riuscire, come indicato da [], quindi deve rientrare in un contesto di errore.
Imposta la variabile FirstPosition creata in precedenza sul valore restituito da FortniteCharacter.GetTransform(). Questa espressione non è fallibile, ma se una delle due espressioni precedenti non va a buon fine, non esegui anche questa, quindi si trova nello stesso contesto di errore.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
Dal momento che tutte le tue espressioni fallibili sono inserite in un blocco di codice if, hai bisogno di un nuovo blocco di codice per il codice da eseguire in caso di esito positivo delle stesse. È qui che entra in gioco then. Quando scrivi la forma di if senza (), utilizza then per il codice che dovrebbe essere eseguito se tutto il codice nel blocco if` ha esito positivo.
Il tuo primo blocco then dovrebbe essere simile al seguente:
then:
Print("Spostati o preparati a subire danni!")
Sleep(10.0)
Hai già visto queste funzioni in precedenza. La funzione Print() viene utilizzata per avvisare il giocatore che deve spostarsi. La funzione Sleep() dà al giocatore 10 secondi per allontanarsi dal punto di generazione prima che venga eseguito il blocco di codice successivo.
Dopo un'attesa di 10 secondi, è il momento di eseguire il codice che controlla se il giocatore si trova a una certa distanza dal punto di generazione e, in caso contrario, arrecargli danni.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
Le prime tre righe sono quasi identiche al primo blocco di codice if, con la differenza che presentano SecondPosition invece di FirstPosition. Ora hai a disposizione due posizioni da confrontare.
In seguito, dichiara e inizializza DistanceBetweenPositions. Per farlo, utilizza una funzione integrata in Verse chiamata DistanceXY(). Questa funzione richiede due argomenti, entrambi coordinate nello spazio 3D chiamate vettori. Utilizza solo coordinate X e Y per misurare la distanza e restituisce tale distanza come valore float. Ricordati di utilizzare solo la proprietà Translation delle due variabili transform.
Infine, confronta DistanceBetweenPositions con un valore letterale float. È una buona idea iniziare con un numero alto per assicurarsi che il codice funzioni. Diminuisci tale valore man mano che identifichi una distanza ragionevole per i giocatori da percorrere nel tempo a disposizione.
Il tuo prossimo blocco then viene eseguito se i giocatori non si spostano della distanza richiesta entro il tempo limite. Quindi è necessario che corrisponda al codice che apporta danni al giocatore.
then:
Print("Distanza di spostamento: {DistanceBetweenPositions}")
Print("Danni da applicare")
HurtPlayer(50.0)
In questo modo viene stampata la distanza effettiva percorsa dal giocatore, una notifica che indica che il danno sta per essere applicato e una chiamata alla funzione HurtPlayer() scritta in precedenza. Chiamando la funzione HurtPlayer(), non devi pensare a come viene implementata. Sai che segue le regole che hai impostato in precedenza per arrecare danni al giocatore.
Script completo
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):
# Viene eseguito quando il dispositivo viene avviato in un gioco in esecuzione
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("Spostati o preparati a subire danni!")
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("Distanza di spostamento: {DistanceBetweenPositions}")
Print("Danni da applicare")
HurtPlayer(50.0)
# Funzioni delle lezioni precedenti
#################################
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("Danni da infliggere: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Se la quantità di danni non elimina il giocatore, infliggi quella quantità
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dà al giocatore un'altra possibilità se la sua salute è bassa
return PlayerHealth - MinHealth
else:
# Elimina il giocatore
return PlayerHealth
Passaggi successivi
Ora che hai imparato i concetti base, puoi iniziare a utilizzare il linguaggio Verse per creare il tuo dispositivo in Unreal Editor per Fortnite! Consulta la guida seguente per scoprire come farlo.