前のレッスン では 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
ここで修正を加える関数では次の 3 つのパラメータを使用します。
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
おつかれさまでした! これでこの関数が、プレイヤーに与えられるダメージを関数内で宣言された変数と定数を使用してではなく、3 つのパラメータを使って計算するようになりました。
現時点で、HurtPlayer() 内の CalculateDamage() への呼び出しにおいて () に 赤色の波線 が表示されることがありますが、これは、3 つのパラメータを必須とするように CalculateDamage() の宣言を更新した一方で、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: {DamageToDo}") FortniteCharacter.Damage(DamageToDo) -
CalculateDamage()の 2 番目のパラメータについては、HurtPlayer()からのパラメータが必要になります。そのパラメータを今から作成します。DamageAmountというfloatパラメータを追加します。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: {DamageToDo}") FortniteCharacter.Damage(DamageToDo) -
CalculateDamage()に追加する 3 つの引数がすべて準備できました。PlayerHealthパラメータ のためのMyCharacterHealthDesiredDamageAmountパラメータ のためのDamageAmountMinHealthパラメータ のための1.0
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("Damage To Do: {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("Player Hurt")
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} damage dealt to player")
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)
次のレッスン
%learn-code-basics-9-failure-in-verse:topic%