Time Trial: Pizza Pursuit eğitimindeki bu adımı tamamlayarak, bir oyuncu eşyaları aldığında ve teslim ettiğinde puanı nasıl yöneteceğini ve kullanıcı arayüzünü puanları gösterecek şekilde güncellemeyi öğreneceksin. Verse’te oyun içi kullanıcı arayüzü oluşturma hakkında daha fazla bilgi edinmek için Oyun içi kullanıcı arayüzü oluşturma bölümüne bakabilirsin.
Puan yöneticisi şunları takip edecek ve gösterecektir:
Toplam Puan: Oyuncunun oyun içinde aldığı toplam puanı ifade eder.
Bekleyen Puanlar: Oyuncunun mevcut alma kümesi için biriktirdiği puanları ifade eder.
Alma Seviyesi: Mevcut alma seviyesini temsil eder.
Kullanıcı Arayüzünü Oluşturma
Verse’te puan yöneticisi kullanıcı arayüzünü oluşturmak için şu adımları izle:
Yeni bir boş Verse dosyası oluştur ve score_manager.verse olarak adlandır.
score_manageradlı yeni bir sınıf oluştur ve aşağıdaki alanları sınıfa ekle:Oyuncuya bir referans kaydetmek için
MaybePlayeradlı isteğe bağlı biragentoluştur.MaybePlayer<internal> : ?agent = falseOyuncunun kullanıcı arayüzüne bir referans kaydetmek için
MaybePlayerUIadlı isteğe bağlı birplayer_ui.MaybePlayerUI<internal> : ?player_ui = falseBu sınıfın üzerine kurulu olduğu Puan Yöneticisi cihazı için bir referans kaydetmeye yarayan bir
score_manager_device. (Verse ile oluşturulangame_coordinator_devicecihazına bağlı olması gerektiğinden bunun düzenlenebilir bir referans olmadığını unutma).ScoreManagerDevice<internal> : score_manager_device = score_manager_device{}Oyuncunun oyunda genel olarak kazandığı tüm puanları temsil eden
TotalGameScoreadlı bir tamsayı değişkeni.var TotalGameScore<private> : int = 0Oyuncunun bu alma kümesi için şu anda biriktirmiş olduğu puanları temsil eden
PendingScoreadlı bir tamsayı değişkeni.var PendingScore<private> : int = 0Mevcut alma seviyesini temsil eden
PickupLeveladlı bir tamsayı değişkeni.var PickupLevel<private> : int = 0
score_manager class tanımın şu anda böyle görünmelidir:
score_manager := class: MaybePlayer<internal> : ?agent = false MaybePlayerUI<internal> : ?player_ui = false ScoreManagerDevice<internal> : score_manager_device = score_manager_device{} var TotalGameScore<private> : int = 0 var PendingScore<private> : int = 0 var PickupLevel<private> : int = 0Sınıf ilk oluşturulduğunda kullanıcı arayüzünü oluştur. Sınıf tanımına, sınıfın bir örneğini her oluşturduğunda yürütülecek bir
blockifadesi ekleyerek bunu yapabilirsin. Kullanıcı arayüzü oluşturmak için aşağıdaki değişkenleri ekle:* Özel tuval widget’ını depolamak için
internalbelirleyicisine sahipCanvasadlı bircanvasdeğişkeni.var Canvas<internal> : canvas = canvas{}Oyuncunun oyun genelinde aldığı ve
TotalGameScoredeğişkeniyle ifade edilen tüm puanları görüntülemek amacıyla metin widget’ını kaydetmek içininternalbelirleyicisine sahipTotalGameScoreWidgetadlı birtext_block. Metin bloğunun varsayılan metin rengini beyaz olarak ayarla.TotalGameScoreWidget<internal> : text_block = text_block{DefaultTextColor := NamedColors.White}Oyuncunun bu alma kümesi için biriktirdiği ve
PendingScoredeğişkeniyle ifade edilen puanları görüntülemek amacıyla metin widget’ını kaydetmek içininternalbelirleyicisine sahipPendingScoreWidgetadlı birtext_block. Metin bloğunun varsayılan metin rengini beyaz olarak ayarla.PendingScoreWidget<internal> : text_block = text_block{}PickupLeveldeğişkeniyle ifade edilen mevcut alma seviyesini görüntülemek amacıyla metin widget’ını kaydetmek içininternalbelirleyicisine sahipPickupLevelWidgetadlı birtext_block. Metin bloğunun varsayılan metin rengini beyaz olarak ayarla.PickupLevelWidget<internal> : text_block = text_block{}Oyuncunun oyunda aldığı toplam puanlar için kullanıcı arayüzünde görüntülenebilecek yerelleştirilebilir metinler oluşturan
TotalGameScoreTextadlı birmessagedöndüren fonksiyon.TotalGameScoreText<localizes>(CurrentTotalGameScore : int) : message = “Toplam Puan: {CurrentTotalGameScore}”Oyuncunun bu alma kümesi için biriktirmiş olduğu puanlarla ilgili olarak kullanıcı arayüzünde görüntülenebilecek yerelleştirilebilir metinler oluşturan
PendingScoreTextadlı birmessagedöndüren fonksiyon.PendingScoreText<localizes>(CurrentPendingScore : int) : message = “Bekleyen Puanlar: {CurrentPendingScore}”Mevcut alma seviyesi için kullanıcı arayüzünde görüntülenebilecek yerelleştirilebilir metinler oluşturan
PickupLevelTextadlı birmessagedöndüren fonksiyon.PickupLevelText<localizes>(CurrentPickupLevel : int) : message = “Alma Seviyesi: {CurrentPickupLevel}”Tuval widget’ını oluşturan ve metni ekranın solunda dikey yönde yığılmış halde konumlandıran bir
blockifadesi ekle.<# Puan yöneticisi yaşam süresi boyunca tuvali oluşturmayacağımız için bu işlemi bu türden bir obje oluşturulduğunda bir kez yapmalısın. #> block: set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.0, Y := 0.25}, Maximum := vector2{X := 0.0, Y := 0.25} } Offsets := margin{Top := 0.0, Left := 25.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.0, Y := 0.0} SizeToContent := true Widget := stack_box: Orientation := orientation.Vertical Slots := array: stack_box_slot: HorizontalAlignment := horizontal_alignment.Left Widget := TotalGameScoreWidget stack_box_slot: HorizontalAlignment := horizontal_alignment.Left Widget := PendingScoreWidget stack_box_slot: HorizontalAlignment := horizontal_alignment.Left Widget := PickupLevelWidget
score_managerkodun şu anda böyle görünmelidir:using { /UnrealEngine.com/Temporary/UI } using { /Fortnite.com/UI } using { /Verse.org/Colors } score_manager := class: var Canvas<internal> : canvas = canvas{} TotalGameScoreWidget<internal> : text_block = text_block{DefaultTextColor := NamedColors.White} PendingScoreWidget<internal> : text_block = text_block{DefaultTextColor := NamedColors.White} PickupLevelWidget<internal> : text_block = text_block{DefaultTextColor := NamedColors.White} MaybePlayer<internal> : ?agent = false MaybePlayerUI<internal> : ?player_ui = false ScoreManagerDevice<internal> : score_manager_device = score_manager_device{} PickupLevelText<private><localizes>(InLevel : int) : message = “Alma Seviyesi: {InLevel}” PendingScoreText<private><localizes>(InPoints : int) : message = “Bekleyen Puanlar: {InPoints}” TotalGameScoreText<private><localizes>(InPoints : int) : message = “Toplam Puan: {InPoints}” var TotalGameScore<private> : int = 0 var PendingScore<private> : int = 0 var PickupLevel<private> : int = 0 <# Puan yöneticisi yaşam süresi boyunca tuvali yeniden oluşturmayacağımız için bu işlemi bu türden bir obje oluşturulduğunda bir kez yapmalısın. #> block: set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.0, Y := 0.25}, Maximum := vector2{X := 0.0, Y := 0.25} } Offsets := margin{Top := 0.0, Left := 25.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.0, Y := 0.0} SizeToContent := true Widget := stack_box: Orientation := orientation.Vertical Slots := array: stack_box_slot: HorizontalAlignment := horizontal_alignment.Left Widget := TotalGameScoreWidget stack_box_slot: HorizontalAlignment := horizontal_alignment.Left Widget := PendingScoreWidget stack_box_slot: HorizontalAlignment := horizontal_alignment.Left Widget := PickupLevelWidgetKullanıcı arayüzündeki metni en son puan değerleri ve mevcut alma seviyesi ile güncelleyen
privatebelirleyicisine sahipUpdateUI()adlı bir fonksiyon oluştur.UpdateUI<private>() : void = if (PlayerUI := MaybePlayerUI?): PickupLevelWidget.SetText(PickupLevelText(PickupLevel)) PendingScoreWidget.SetText(PendingScoreText(PendingScore)) PendingScoreWidget.SetText(TotalGameScoreText(TotalGameScore))Oyuncunun kullanıcı arayüzünü özel puan yöneticisi kullanıcı arayüzü ile güncelleyen
AddScoreManagerToUI()adlı bir fonksiyon oluştur.AddScoreManagerToUI<public>() : void = if (PlayerUI := MaybePlayerUI?): PlayerUI.AddWidget(Canvas) UpdateUI()Oyun döngüsünün değerleri güncelleyebilmesi amacıylakullanıcı arayüzünde gösterilen her bir değer için bir fonksiyon oluştur:
publicbelirleyicisine sahipAddPendingScoreToTotalScore()adlı bir fonksiyon. Bu fonksiyon, beklemedeki puanı toplam oyun puanına eklemeli ve beklemedeki puan değerini0olarak ayarlamalıdır.deferifadesiyle,PendingScoredeğerini sıfırlamayı ve kullanıcı arayüzünü güncellemeyi,TotalGameScoredeğişkeninin güncellenmesi sonrasına erteleyebilirsin. Bunu yapmakPendingScoresıfırlanmadan önce değerini tutmak için geçici bir değişken kullanmak zorunda kalmamanı sağlar.Verse<# Adds PendingScore to TotalGameScore and resets PendingScore to 0.#> AddPendingScoreToTotalScore<public>() : void = defer: set PendingScore = 0 UpdateUI() set TotalGameScore += PendingScorepublicbelirleyicisine sahipUpdatePendingScore()adlı bir fonksiyon ve fonksiyonun mevcut beklemedeki puana ekleyeceğiPointsadlı bir tamsayı parametresi.Verse<# Adds the given amount of points to the pending points. #> UpdatePendingScore<public>(Points : int) : void = set PendingScore += Points UpdateUI()publicbelirleyicisine sahipUpdatePickupLeveladlı bir fonksiyon ve mevcut alma seviyesi için yeni değeri ifade edenLeveladlı bir tamsayı parametresi.VerseUpdatePickupLevel<public>(Level : int) : void = set PickupLevel = Level UpdateUI()publicbelirleyicisine sahipAwardScore()adlı bir fonksiyon oluştur. Bu fonksiyon, Puan Yöneticisi cihazını kullanarak puanı oyuncuya verir ve cihazı etkinleştirir.Verse<# Awards the score to the player with the Score Manager device, by activating it. #> AwardScore<public>() : void = ScoreManagerDevice.SetScoreAward(TotalGameScore) if (AwardedPlayer := MaybePlayer?): ScoreManagerDevice.Activate(AwardedPlayer)
score_managersınıfın şu anda böyle görünmelidir:Versescore_manager := class: <# Since we won't recreate the canvas during the score manager lifetime, do it once anytime an object of this type is created.> block: set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.0, Y := 0.25}, Maximum := vector2{X := 0.0, Y := 0.25} } Offsets := margin{Top := 0.0, Left := 25.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.0, Y := 0.0} SizeToContent := truescore_managersınıfını ekledikten sonra oyundan oyuncu değişkenlerini başlatmak için sınıfa ait bir oluşturucu yarat. Oyuncunun kullanıcı arayüzüne bir referans elde etmek için oyuncu referansı türünüagentdeğerindenplayerdeğerine dönüştürmen gerektiğini unutma.VerseMakeScoreManager<constructor><public>(InPlayer : agent, InScoreManagerDevice : score_manager_device) := score_manager: MaybePlayer := option{InPlayer} MaybePlayerUI := option{GetPlayerUI[player[InPlayer]]}score_manager.verse dosyan şimdi şöyle görünmelidir:
Verseusing { /UnrealEngine.com/Temporary/SpatialMath} using { /UnrealEngine.com/Temporary/UI } using { /Fortnite.com/Devices } using { /Fortnite.com/UI } using { /Verse.org/Colors } using { /Verse.org/Simulation } MakeScoreManager<constructor><public>(InPlayer : agent, InScoreManagerDevice : score_manager_device) := score_manager: MaybePlayer := option{InPlayer} MaybePlayerUI := option{GetPlayerUI[player[InPlayer]]}
Oyun Döngüsünde Puanı ve Kullanıcı Arayüzünü Güncelleme
game_coordinator_device.verse dosyasında oyun sırasındaki kullanıcı arayüzünü oluşturmak ve güncellemek için aşağıdaki adımları izle:
Aşağıdaki özellikleri
game_coordinator_devicesınıfına ekle:privatebelirleyicisine sahipScoreManageradlı birscore_managerdeğişkeni. Bu örnek, oyuncunun puanını ve Kullanıcı Arayüzünü yönetir.var ScoreManager<private> : score_manager = score_manager{}Bölümde Puan Yöneticisi cihazına ayarlayabileceğin, düzenlenebilir bir
score_manager_device.score_managersınıfı bu cihazı kullanacaktır.@editable ScoreManagerDevice<public> : score_manager_device = score_manager_device{}Oyuncunun her bir alma seviyesinde kazanabileceği puanları belirlemek için
publicbelirleyicisine sahipPointsForPickupLeveladlı düzenlenebilir bir tamsayı dizisi.@editable # Bir alma işleminin alma seviyesine göre kaç puan değerinde olduğunu belirler. PointsForPickupLevel<public> : []int = array{1, 2, 3}
StartGamefonksiyonunda oyuncuya ve Puan Yöneticisi cihazına bir referanslaMakeScoreManager()oluşturucusunu çağırarak puan yöneticisi değişkenini başlat ve oyuncunun görmesi için kullanıcı arayüzünü oluştur.VerseStartGame<private>()<suspends> : void = Logger.Print("Trying to start the game...") # We construct a new countdown_timer that'll countdown from InitialCountdownTime once started. # Also construct a new score_manager that'll keep track of the player's score and pickup level. # The countdown_timer and score_manager require a player to show their UI to. # We should have a valid player by now: the one that entered the vehicle, triggering the game start. if (ValidPlayer := MaybePlayer?): Logger.Print("Valid player, starting game...")Oyun döngüsünün
PickupDeliveryLoop()fonksiyonunda alma seviyesi her değiştiğinde ve oyuncu bir alma veya teslimi tamamladığında kullanıcı arayüzünü güncelle:VersePickupDeliveryLoop<private>()<suspends> : void = PickupZonesTags : []pickup_zone_tag = array{pickup_zone_level_1_tag{}, pickup_zone_level_2_tag{}, pickup_zone_level_3_tag{}} MaxPickupLevel := PickupZonesTags.Length - 1 FirstPickupZoneCompletedEvent := event(){} loop: var PickupLevel : int = 0 var IsFirstPickup : logic = true # Every time the loop restarts, we should reset the pickup level UI through the ScoreManager.Şimdi geri sayım bittiğinde oyuncuya puanını ver.
HandleCountdownEnd()içindeScoreManager.AwardScore()fonksiyonunu çağır.HandleCountdownEnd<private>(InPlayer : player)<suspends>:void= TotalTime := CountdownTimer.CountdownEndedEvent.Await() ScoreManager.AwardScore() EndGame.Activate(InPlayer)game_coordinator_device.verse dosyan şu anda böyle görünmelidir:
Verseusing { /Verse.org/Simulation } using { /Fortnite.com/Devices } using { /Fortnite.com/Vehicles } using { /Fortnite.com/Characters } using { /Fortnite.com/Playspaces } using { /Verse.org/Random } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/SpatialMath } using { /EpicGames.com/Temporary/Curves } using { /Verse.org/Simulation/Tags }