Bu alıştırmada hedefin, oyuncunun tanımlı bir süre içinde doğma karesinden belirli bir mesafeye kadar uzaklaşmaması durumunda hasar almasını sağlamaktır. Oyuncudan konum bilgilerini almak ve doğduktan sonraki 10 saniye içinde ne kadar uzağa gittiğini anlamak için başarısızlık ifadelerini ve başarısızlık bağlamlarını kullanacaksın.
İlk olarak Verse dosyanda HurtPlayer() ve CalculateDamage() fonksiyonlarının hâlâ mevcut olduğundan emin ol. Oyuncu yeterince uzağa hareket etmediyse HurtPlayer() fonksiyonunu çağıracaksın. Bir hatırlatma olarak bu fonksiyonların kodunu aşağıda görebilirsin.
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("Verilecek Hasar: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Hasar miktarı oyuncuyu yok etmeyecekse o miktarda hasar ver
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Canı düşükse oyuncuya bir şans daha ver
return PlayerHealth - MinHealth
else:
# Oyuncuyu avla
return PlayerHealth
Şimdi bölümdeki tüm player objelerini (bu örnekte yalnızca bir adet, yani sen!) alman gerekiyor. Ayrıca oyuncunun transform objesini farklı zamanlarda depolamak için iki değişken oluşturacaksın. Transform, bir objenin konumu, dönüşü ve ölçeği hakkında veriler barındırır. Bu alıştırmada yalnızca konum verisine ihtiyacın var. O da transform objesinde depolanır.
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
Şimdi if kullanarak birkaç başarısızlık bağlamı oluşturalım. Aşağıdaki ilk iki satır, player objesinden fort_character objesini alır. Kod sana tanıdık geliyorsa HurtPlayer() fonksiyonundaki kodun bir kısmıyla neredeyse aynı olduğu içindir. Burada tekrar yazman gerekiyor çünkü aynı zamanda bir ‘fort_character' karakterinin transform objesini almak için buna ihtiyacın var. Bu kod da [] ile gösterildiği üzere başarısız olabilir. Bu yüzden bir başarısızlık bağlamında olmalıdır.
Daha önce oluşturduğun FirstPosition değişkenini FortniteCharacter.GetTransform()tarafından döndürülen değere ayarla. Bu ifade başarısız olabilir değildir ancak önceki iki ifadenin herhangi biri başarısız olursa bu ifadeyi çalıştırmak istemezsin. Yani aynı başarısızlık bağlamındadır.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
Tüm başarısız olabilir ifadelerin if kod bloğunun içinde olduğundan ifadelerin başarılı olması durumunda çalıştırmak istediğin kod için yeni bir kod bloğuna ihtiyacın vardır. then burada devreye girer. if biçimini () olmadan yazdığında if kod bloğundaki tüm kodların başarılı olması halinde çalışması gereken kod için then kullan.
İlk then bloğun bunun gibi görünmelidir.
then:
Print("Ya hareket et ya da hasar almaya hazır ol!")
Sleep(10.0)
Bu fonksiyonların ikisini de daha önce görmüştün. Print(), oyuncuyu hareket etmesi gerektiği konusunda uyarmak için kullanılır. Sleep() ise bir sonraki kod bloğu çalışmadan önce oyuncuya doğma noktasından uzaklaşması için 10 saniye verir.
10 saniyelik bir beklemenin ardından oyuncunun doğma noktasından belirli bir uzaklıkta olup olmadığını kontrol edecek ve belirli bir uzaklıkta değilse oyuncuya hasar verecek kodu çalıştırma zamanı gelir.
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
İlk üç satır, FirstPosition yerine SecondPosition ayarlaman dışında birinci if kod bloğu ile neredeyse aynıdır. Şimdi karşılaştıracağın iki konum vardır.
Bundan sonra DistanceBetweenPositions fonksiyonunu tanımla ve başlat. Bunu almak için DistanceXY() adlı yerleşik bir Verse fonksiyonu kullanacaksın. Bunun için iki bağımsız değişken gerekir. Bunlar vektör olarak adlandırılan 3D alandaki koordinatlardır. Mesafeyi ölçmek için yalnızca X ve Y koordinatları kullanılır ve mesafe bir float olarak döndürülür. İki transform değişkeninin yalnızca Translation özelliğini kullanmayı unutma.
Son olarak DistanceBetweenPositions değerini bir değişmez float değeriyle karşılaştır. Kodunun çalıştığından emin olmak için büyük bir sayıyla başlamak iyi bir fikirdir. Verilen süre içinde hareket etmek için makul bir mesafe bulana kadar değeri azalt.
Bir sonraki then bloğun, oyuncular süre sınırı içinde gerekli mesafeyi katetmezse çalışır. Bunun oyuncuya hasar veren kod olmasını isteyeceksin.
then:
Print("Katedilen Mesafe: {DistanceBetweenPositions}")
Print("Hasar Veriliyor")
HurtPlayer(50.0)
Bu kod, oyuncunun ilerlediği gerçek mesafeyi, hasarın uygulanmak üzere olduğuna dair bildirimi ve daha önce yazdığın HurtPlayer() fonksiyonuna yönelik bir çağrıyı yazdırır. HurtPlayer() fonksiyonunu çağırırken nasıl uygulandığını düşünmek zorunda kalmazsın. Daha önce oyuncuya hasar vermeyle ilgili belirlediğin kuralları izleyeceğini bilirsin.
Tam Kod
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):
# Cihaz, çalışmakta olan bir oyunda başlatıldığında çalışır
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("Ya hareket et ya da hasar almaya hazır ol!")
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("Katedilen Mesafe: {DistanceBetweenPositions}")
Print("Hasar Veriliyor")
HurtPlayer(50.0)
# Önceki Derslerden Fonksiyonlar
#################################
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("Verilecek Hasar: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Hasar miktarı oyuncuyu yok etmeyecekse o miktarda hasar ver
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Canı düşükse oyuncuya bir şans daha ver
return PlayerHealth - MinHealth
else:
# Oyuncuyu avla
return PlayerHealth
Sonraki Adımlar
Artık temel bilgileri öğrendiğine göre Verse kullanarak Fortnite İçin Unreal Editor’de kendi cihazını oluşturmaya hazırsın! Nasıl yapacağını öğrenmek için aşağıdaki kılavuza göz at.