Bu son eğitim adımında, kodunu nasıl geliştireceğini görecek ve bazı önemli Verse kavramlarını öğreneceksin.
Verse Kodunu Geliştir
Bu sayfa, kodda yapılacak değişikliklerde sana adım adım rehberlik sağlar, ancak çalışmanı kontrol etmek istersen nihai sonuç için Tam Kod bölümünü inceleyebilirsin.
Yeniden düzenleme (refactoring), tasarımı veya uygulamayı iyileştirmek için mevcut kodun davranışını değiştirmeden onu yeniden yapılandırdığın bir süreçtir. Kodun yeniden düzenlenmesinde en yaygın hedefler şunlardır:
Değişkenlerin daha iyi bir şekilde adlandırılması, boşlukların daha iyi bir şekilde yerleştirilmesi veya genel kod yapısının daha iyi kurulmasıyla okunabilirliğin artırılması.
Davranışların daha basit veya daha verimli bir şekilde uygulanmasıyla performansın iyileştirilmesi.
Benzer fonksiyonların tek bir fonksiyon altında toplanmasıyla veya benzer türdeki ve benzer amaçlara sahip birden fazla değişkenin diziler (array) gibi kapsayıcılar altında toplanmasıyla tekrarların ve kod şişkinliğinin (büyük, gereksiz veya aşırı karmaşık kod) azaltılması.
Bu hedefleri izleyerek yeniden düzenleme yapman, sürdürülebilir, okunması ve tekrar gözden geçirilmesi kolay, genişletilebilir ve gelecekteki davranış iyileştirmeleri için işlevselliğinin artırılması kolay olacak kod yazmana yardımcı olacaktır. Böylece oyunların gerçekten seviye atlar!
GetFirstPlayer()
Okunabilir kod yazmak harika bir programlama pratiğidir. Örneğin GetFirstPlayer(), GetPlayspace().GetPlayers()[0]’dan daha nettir. Ayrıca bu yaklaşım, işlemin amacını net bir şekilde belirttiği için yaygın işlemleri programlamak açısından en iyi uygulamalardan biridir.
shooting_range_manager_device.versedosyasını aç.GetFirstPlayermetodunu ekle.GetFirstPlayermetodu başarısız olabileceği ve geri alınabileceği için onun <decides><transacts> efekt belirleyicilerine sahip olduğuna dikkat et. Başarısız olabilir ifadeler ve başarısızlık bağlamları hakkında daha fazla ayrıntı için Verse’te Hata kısmını okuyabilirsin.Verse# Returns the first player in the playspace. GetFirstPlayer()<decides><transacts>:player= return GetPlayspace().GetPlayers()[0]AdjustScoremetodunu, yeniGetFirstPlayermetodunu kullanacak şekilde değiştir.GetFirstPlayermetodu başarısız olabilir olduğundan onun parantez yerine köşeli parantezle çağrıldığına dikkat et.Verse# Adjusts the player's score by the provided value. AdjustScore(Value:int):void= # Start the timer if it hasn't started yet. if (not IsTimerStarted?): StartTimer() # Sets the score award to the base value of the target multiplied by the current weapon level. ScoreManager.SetScoreAward(Value * CurrentWeaponLevel) <# --- New Code Start --- #>IncreaseWeaponLevelmetodunu, yeniGetFirstPlayermetodunu kullanacak şekilde değiştir.Verse# Increases the player's weapon level by one (up to the maximum value). IncreaseWeaponLevel():void= if: # If able to retrieve the first player and current weapon level isn't maxed, then... <# --- New Code Start --- #> Player:player = GetFirstPlayer[] <# --- New Code End --- #>
Hedef Sınıf Sarmalayıcıları ve Dizileri
Kod temizlerken bir diğer önemli hedef de tekrarı en aza indirmektir. Mevcut uygulamada, her doğru ve yanlış hedef kendi geri çağırma ve isabet işaretini tanımlamakta ve bu da kodu tekrarlayıcı hale getirmektedir.
Her bir hedefin ihtiyaç duyduğu her şeyi içeren bir sarmalayıcı sınıfı oluşturmak daha iyi bir yaklaşımdır. Böylece atış poligonu yöneticisi her bileşeni ayrı ayrı tanımlamak yerine bu hedef sarmalayıcılarını bir dizide yönetebilir.
Bu uygulama yalnızca tekrarı azaltmakla kalmaz, aynı zamanda ölçeklenebilirliği de artırır. Ek kod yazmadan istediğin kadar hedef ekleyebilirsin.
good_target_wrappersınıfını tanımla. Bunu,shooting_range_manager_devicesınıf tanımının üstüne koyabilirsin.Verse# A wrapper class for the good targets to support array storage with a self-contained event callback. good_target_wrapper := class: @editable Target:shooting_range_target_track_device = shooting_range_target_track_device{} @editable Score:int = 100 # A circular reference to the shooting range manager device.bad_target_wrappersınıfını tanımla. Bunu,shooting_range_manager_devicesınıf tanımının üstüne koyabilirsin.Verse# A wrapper class for the bad targets to support array storage with a self-contained event callback. bad_target_wrapper := class: @editable Target:shooting_range_target_device = shooting_range_target_device{} @editable Score:int = -100 # A circular reference to the shooting range manager device.Aşağıdaki dizi özelliklerini Atış Poligonu Yöneticisi cihazına ekle.
Verse@editable: GoodTargets:[]good_target_wrapper = array{} @editable BadTargets:[]bad_target_wrapper = array{}Atış Poligonu Yöneticisi cihazından aşağıdakileri kaldır. Bunlar artık sarmalayıcı sınıflar tarafından işlenecektir.
GoodTarget1-3
GoodTargetScore
BadTarget1-3
BadTargetScore
HitGoodTarget1-3
OnGoodTarget1-3Hit()
OnBadTarget1-3Hit()
OnBeginmetodunu, doğru ve yanlış hedefleri, diziyi döngüden geçirerek başlatacak şekilde değiştir.Verse# Runs when the device is started in a running game. OnBegin<override>()<suspends>:void= <# --- New Code Start --- #> # Initialize GoodTargets. for (GoodTarget : GoodTargets): GoodTarget.Init(Self) # Initialize BadTargets.CheckCombometodunu, kombonun tamamlanıp tamamlanmadığını doğru hedef dizisini döngüden geçirerek kontrol edecek şekilde değiştir.Verse# If the combo is complete, enable the ComboTarget. CheckCombo():void= <# --- New Code Start --- #> # If any of the good targets are not hit, exit the function. for (GoodTarget : GoodTargets): if (not GoodTarget.IsHit?): returnResetCombometodunu, doğru hedef dizisini döngüden geçirecek şekilde güncelle.Verse# Resets the combo tracking variables, re-enables all GoodTargets, and disables the ComboTarget. ResetCombo():void= <# --- New Code Start --- #> for (GoodTarget : GoodTargets): GoodTarget.Reset() <# --- New Code End --- #>Verse kodunu kaydet ve derle.
Tam Kod
using { /Fortnite.com/Devices }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
<#>
Utility Classes
<#>
# A wrapper class for the good targets to support array storage with a self-contained event callback.
good_target_wrapper := class:
Hepsini Bir Araya Getir
Verse cihazında, değiştirilen düzenlenebilir özellikler için yeni değerler ayarlaman gerekir.
Görünüm penceresinde veya Anahat Düzenleyicisi panelinde shooting_range_manager_device’ı seç.
Ayrıntılar panelinde aşağıdaki parametreleri ayarla:
GoodTargets dizisine üç eleman ekle ve bunların her birini ilgili hedeflerine ayarla. İsteğe bağlı olarak, artık bir hedefin puan değerini de değiştirebilirsin.
BadTargets dizisine üç eleman ekle ve bunların her birini ilgili hedeflerine ayarla. İsteğe bağlı olarak, artık bir hedefin puan değerini de değiştirebilirsin.
Diğer tüm özelliklerin beklendiği gibi ayarlandığını doğrula.
Kendi Kendine Yapabileceklerin
Bu bölüm bitti ama sen devam edebilirsin. Daha fazla Verse fonksiyonu ve oynanış özelliği için Oyun Mekaniklerini Öğren kısmında yer alan dokümantasyona bakabilirsin.