В предыдущем упражнении мы создали хорошую базу для CalculateDamage(), но тело функции содержит константы и переменные, которые лучше использовать как параметры. Вспомним, как функция выглядит сейчас:
CalculateDamage() : float =
MinHealth : float = 1.0
PotionDamageAmount : float = 80.0
var PlayerHealth : float = 100.0
# Если величина урона не приводит к устранению игрока, нанести урон такой величины
if (PlayerHealth > PotionDamageAmount):
return PotionDamageAmount
else if (PlayerHealth > MinHealth):
# Дать игроку ещё один шанс, если у него низкий запас здоровья
return PlayerHealth - MinHealth
else:
# Устранить игрока
return PlayerHealth
Ваша обновлённая версия функции будет принимать три параметра:
PlayerHealth: текущее здоровье игрока.DesiredDamageAmount: максимальное количество урона, которое может получить игрокMinHealth: здоровье, которое должно быть у игрока, еслиDesiredDamageAmountуменьшит его здоровье до0,0или ниже.
Обновите функцию, чтобы она выглядела следующим образом:
CalculateDamage(PlayerHealth : float, DesiredDamageAmount : float, MinHealth : float) : float =
# Если величина урона не приводит к устранению игрока, нанести урон такой величины
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Дать игроку ещё один шанс, если у него низкий запас здоровья
return PlayerHealth - MinHealth
else:
# Устранить игрока
return PlayerHealth
Отлично! Теперь функция вычисляет наносимый игроку урон по трём параметрам, а не по переменным и константам, объявленным внутри функции.
На данном этапе вы можете увидеть красное подчёркивание под () в вызове CalculateDamage() в HurtPlayer(). Это происходит потому, что мы обновили объявление CalculateDamage(), чтобы оно требовало 3 параметра, но не передаём никаких аргументов при вызове CalculateDamage(). Мы исправим это в следующих шагах.
-
Прежде чем передавать аргумент
PlayerHealthвCalculateDamage(), нужно узнать запас здоровья персонажа. Для этого используем методGetHealth(). Мы будем вызывать его так же, какDamage()иHeal(), но этот метод будет возвращать значение, которое нужно сохранить в функцииHurtPlayer().HurtPlayer() : void = Playspace : fort_playspace = GetPlayspace() AllPlayers : []player = Playspace.GetPlayers() if (FirstPlayer : player = AllPlayers[0]): if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]): MyCharacterHealth : float = FortniteCharacter.GetHealth() DamageToDo: float = CalculateDamage() Print("Наносимый урон: {DamageToDo}") FortniteCharacter.Damage(DamageToDo) -
Для второго параметра в
CalculateDamage()понадобится параметр изHurtPlayer(). Давайте его создадим. Добавьте параметрfloatс названиемDamageAmount. Теперь функцияHurtPlayer()должна выглядеть следующим образом:HurtPlayer(DamageAmount : float) : void = Playspace: fort_playspace = GetPlayspace() AllPlayers: []player = Playspace.GetPlayers() if (FirstPlayer : player = AllPlayers[0]): if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]): MyCharacterHealth : float = FortniteCharacter.GetHealth() DamageToDo : float = CalculateDamage() Print("Наносимый урон: {DamageToDo}") FortniteCharacter.Damage(DamageToDo) -
Теперь у нас есть все три аргумента, которые можно добавить в
CalculateDamage():MyCharacterHealthдля параметраPlayerHealth;DamageAmountдля параметраDesiredDamageAmount;1.0для параметраMinHealth.
Функция HurtPlayer() будет выглядеть следующим образом, и в коде больше не будет ошибок:
HurtPlayer(DamageAmount : float) : void =
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (FirstPlayer : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]):
MyCharacterHealth : float = FortniteCharacter.GetHealth()
DamageToDo : float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Наносимый урон: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
Вызовите HurtPlayer() несколько раз, чтобы увидеть различные эффекты в зависимости от здоровья игрока.
А что насчёт функции HealPlayer()? Раз вы уже вы знаете, как использовать параметры, сможете обновить её?
Есть ещё один полезный метод. Он называется SetMaxHealth() и вызывается так же, как Damage(), Heal() и GetHealth(). Попробуйте использовать SetMaxHealth() и ваши знания о параметрах и функциях, чтобы обновить функцию HealPlayer(). Подумайте, как можно заинтересовать или развеселить игрока.
Полный сценарий
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /Verse.org/Simulation }
using { /Verse.org/Verse }
hello_world_device := class(creative_device):
# Выполняется при запуске устройства в работающей игре
OnBegin<override>()<suspends>:void=
HurtPlayer(80.0)
Print("Игрок получил урон")
CalculateDamage(PlayerHealth : float, DesiredDamageAmount : float, MinHealth : float) : float =
# Если величина урона не приводит к устранению игрока, нанести урон такой величины
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Дать игроку ещё один шанс, если у него низкий запас здоровья
return PlayerHealth - MinHealth
else:
# Устранить игрока
return PlayerHealth
HurtPlayer(DamageAmount : float) : void =
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (FirstPlayer : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]):
MyCharacterHealth : float = FortniteCharacter.GetHealth()
DamageToDo : float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
FortniteCharacter.Damage(DamageToDo)
Print("Игрок получил урон {DamageToDo}")
HealPlayer(HealAmount : float) : void =
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (FirstPlayer : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = FirstPlayer.GetFortCharacter[]):
FortniteCharacter.Heal(HealAmount)