Para este exercício, seu objetivo é causar danos ao jogador caso ele não se afaste uma certa distância da própria plataforma de surgimento dentro de um tempo definido. Você usará expressões falíveis e contextos de falha para obter as informações da localização do jogador e descobrir o quanto ele se moveu 10 segundos após o surgimento.
Primeiro, verifique se ainda tem as funções HurtPlayer()
e CalculateDamage()
no arquivo Verse. Você chamará HurtPlayer()
se o jogador não tiver se movido o suficiente. Como lembrete, aqui está o código dessas funções:
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("Dano que será causado: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Se a quantidade de dano não eliminar o jogador, causar esta quantidade de dano
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dar ao jogador mais uma chance se o nível de vida dele estiver baixo
return PlayerHealth - MinHealth
else:
# Eliminar o jogador
return PlayerHealth
~~~
Agora, você precisará obter todos os objetos `player` no nível (neste caso apenas um, você!). Você também criará duas variáveis para armazenar o objeto `transform` do jogador em ocasiões diferentes. Um objeto **transform** contém dados sobre a localização, a rotação e a escala de um objeto. Para este exercício, você precisa apenas da localização, mas ela está armazenada no objeto `transform`.
~~~(verse)
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
É hora de criar alguns contextos de falha usando if
. As duas primeiras linhas abaixo extraem o objeto fort_character
do objeto player
. Se esse código parece familiar, é porque é quase igual a parte do código da função HurtPlayer()
. Você tem que escrevê-lo novamente aqui porque também precisa dele para obter o objeto transform
de um fort_character
. Ele também pode falhar, conforme indicado por []
. Portanto, deve estar em um contexto de falha.
Defina a variável FirstPosition
que você criou anteriormente como o valor retornado por FortniteCharacter.GetTransform()
. Essa expressão não é falível, mas se qualquer uma das duas expressões anteriores falhar, não convém executar essa expressão e, portanto, ela está no mesmo contexto de falha.
~~~(verse) if: Player:player = AllPlayers[0] FortniteCharacter:fort_character = Player.GetFortCharacter[] set FirstPosition = FortniteCharacter.GetTransform()
Como todas as expressões falíveis estão no bloco de código `if`, você precisa de um novo bloco de código para o código que deseja executar se ele for bem-sucedido. É aí que entra `then`. Quando escrever a forma de `if` sem `()`, use `then` para o código que deve ser executado quando todo o código no bloco de código `if` for bem-sucedido.
Seu primeiro bloco `then` deve ficar assim:
~~~(verse)
then:
Print("Mexa-se ou prepare-se para sofrer dano!")
Sleep(10.0)
~~~
Você já viu essas duas funções antes: `Print()` é usada aqui para avisar ao jogador que ele precisa se mover; `Sleep()` dá ao jogador 10 segundos para se afastar do ponto de surgimento antes que o próximo bloco de código seja executado.
Após uma espera de 10 segundos, é hora de executar o código que verificará se o jogador está a uma certa distância do seu ponto de surgimento e, se não estiver, aplicará danos a ele.
~~~(verse)
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
As três primeiras linhas são quase iguais ao primeiro bloco de código if
, com a diferença de que agora você está configurando SecondPosition
em vez de FirstPosition
. Agora, você tem dois locais para comparar.
Em seguida, declare e inicialize DistanceBetweenPositions
. Para isso, você usará uma função interna da linguagem Verse chamada DistanceXY()
. Ela usa dois argumentos, ambos coordenadas no espaço 3D chamadas de vetores. Ele usa apenas as coordenadas X e Y para medir a distância e retorna essa distância como um float
. Lembre-se de usar apenas a propriedade Translation
das duas variáveis transform
.
Por fim, compare DistanceBetweenPositions
com um valor float
literal. É uma boa ideia começar com um número grande para garantir que o código esteja funcionando. Diminua-o conforme descobre uma distância razoável de deslocamento dentro do tempo determinado.
O próximo bloco then
será executado se os jogadores não se deslocarem a distância necessária dentro do limite de tempo. Então, este deve ser o código que aplica dano ao jogador:
~~~(verse) then: Print("Distância percorrida: {DistanceBetweenPositions}") Print("Aplicando dano") HurtPlayer(50.0)
Esse código mostrará a distância real que o jogador se moveu, uma notificação de que danos estão prestes a serem aplicados e uma chamada para a função `HurtPlayer()` escrita anteriormente. Ao chamar a função `HurtPlayer()`, você não precisa pensar em como ela é implementada. Você sabe que ela seguirá as regras definidas anteriormente para aplicar dano ao jogador.
## O script completo
~~~(verse)
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):
# É executado quando o dispositivo é iniciado em um jogo em execução
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("Mexa-se ou prepare-se para sofrer dano!")
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("Distância percorrida: {DistanceBetweenPositions}")
Print("Aplicando dano")
HurtPlayer(50.0)
# As funções das aulas 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("Dano que será causado: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Se a quantidade de dano não eliminar o jogador, causar esta quantidade de dano
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dar ao jogador mais uma chance se o nível de vida dele estiver baixo
return PlayerHealth - MinHealth
else:
# Eliminar o jogador
return PlayerHealth
Próximos passos
Agora que conhece o básico, você já pode usar a linguagem Verse para criar seu próprio dispositivo no Unreal Editor para Fortnite! Confira o guia a seguir para saber como.