Temel oynanışı ayarladığına göre, şimdi önemli olan oyuncuya eylemlerinin ardından görsel geri bildirim vermek, örneğin:
Oyuncuya nereye gitmesi gerektiğini gösteren bir hedef işareti.
Oyuncu puan aldığında geri sayıma daha fazla süre ekleme.
Yalnızca oyuncu araca girdiğinde oyunu başlatma.
Oyuncunun pizzaları haritaya düşürmemesi için yeni bir eşya aldığında oyuncudaki fazla pizzaları kaldırma.
Time Trial: Pizza Pursuit eğitimindeki bu adımı tamamlayarak bir oyunu nasıl süsleyeceğini öğreneceksin.
Bir Sonraki Seçili Alma Bölgesini Oyuncuya Gösterme
Oyuncuya nereye gitmesi gerektiğini gösteren bir hedef işareti eklemek için aşağıdaki adımları izle. game_coordinator_device.verse dosyasını güncelle:
game_coordinator_devicesınıfına,publicbelirleyicisine sahipPickupMarkeradlı düzenlenebilir birobjective_markerekle.@editable PickupMarker<public> : objective_marker = objective_marker{}PickupDeliveryLoop()fonksiyonunun başlangıcındaPickupMarkerobjesiyle ilişkili Harita Göstergesi cihazını etkinleştir ve fonksiyon çıktığında cihazı devre dışı bırakmak için birdeferifadesi ayarla.PickupDeliveryLoop<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(){} <# Defer, MapIndicator cihazını devre dışı bırakır, böylece PickupDeliveryLoop işlevinin sonlandırılması her zaman işaretin devre dışı bırakılmasıyla sonuçlanır. Defer ayrıca, PickupDeliveryLoop iptal edilirse de yürütülür. #> defer: if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.DeactivateObjectivePulse(ValidPlayer) PickupMarker.MapIndicator.Disable() PickupMarker.MapIndicator.Enable()Bir sonraki alma bölgesi seçildiğinde alma işaretini seçili alma bölgesine taşı ve oyuncuyu ona yönlendirmek için
PickupMarker.MapIndicator.ActivateObjectivePulse()fonksiyonunu çağır.Verserace: loop: if (PickupZone : base_zone = PickupZoneSelectors[PickupLevel].SelectNext[]): PickupZone.ActivateZone() Sleep(0.0) PickupMarker.MoveMarker(PickupZone.GetTransform(), ?OverTime := 0.0) if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.ActivateObjectivePulse(ValidPlayer) <# This is the only defer we need for any PickupZone we activate. It will either deactivate the first PickupZone at the end of each outer loop,
Oyuncu Puan Aldığında Geri Sayıma Daha Fazla Süre Ekleme
Bir oyuncuya teslim ettiği her eşya için ek süre ödülü vererek oyuncuyu eşyaları daha sık teslim etmeye teşvik edebilirsin.
Geri sayıma daha fazla süre eklemek için şu adımları izle:
Toplam puana eklenen puanları kullanarak geri sayımı güncelleyebilmek için score_manager.verse dosyasında
AddPendingScoreToTotalScore()fonksiyonunun dönüş türünüintolarak değiştir vereturn PendingScoreifadesini ekle.AddPendingScoreToTotalScore<public>() : int = set TotalGameScore += PendingScore defer: set PendingScore = 0 UpdateUI() return PendingScoreTeslimatta verilen her puan için geri sayım süreölçerine kaç saniye ekleneceğini göstermek için game_coordinator_device.verse dosyasında
game_coordinator_devicesınıf tanımına,publicbelirleyicisine sahipDeliveryBonusSecondsadlı düzenlenebilir birfloatekle.# Bir teslimat yapıldığında geri sayım süreölçerine kaç saniye ekleneceğini belirler. @editable DeliveryBonusSeconds<public> : float = 20.0Bonus süreyi hesaplamak için teslim
blockifadesini güncelle ve geri sayım süreölçerinde kalan süreyi güncelle.block: FirstPickupZoneCompletedEvent.Await() if (DeliveryZone := DeliveryZoneSelector.SelectNext[]): DeliveryZone.ActivateZone() # PickupDeliveryLoop döngüsünün iptal edildiğinde tüm etkin teslim bölgelerini de devre dışı bırakarak sonlanması için bölge devre dışı bırakmayı geciktiriyoruz. defer: Logger.Print("Deactivating delivery zone.", ?Level := log_level.Normal) DeliveryZone.DeactivateZone() DeliveryZone.ZoneCompletedEvent.Await() Logger.Print("Delivered", ?Level := log_level.Normal) PointsCommitted := ScoreManager.AddPendingScoreToTotalScore() BonusTime : float = DeliveryBonusSeconds * PointsCommitted CountdownTimer.AddRemainingTime(BonusTime) else: Logger.Print("Seçilecek bir sonraki DeliveryZone bulunamıyor.", ?Level := log_level.Error) return # PickupDeliveryLoop döngüsünden doğan hataOynanış testi uygularken bir pizza aldıktan sonra teslim bölgesine gitmek geri sayıma daha fazla süre ekler.
Oyuncu Araca Girdiğinde Oyunu Başlatma
Oyuncu araca girdiğinde oyunu başlatmak ve araçtan çıktığında işlem yapmak için aşağıdaki adımları izle:
publicbelirleyicisine sahip Araç Oluşturma Yeri cihazına düzenlenebilir bir referans oluştur.@editable VehicleSpawner<public> : vehicle_spawner_atk_device = vehicle_spawner_atk_device{}privatevesuspendsbelirleyicilerine sahipStartGameOnPlayerEntersVehicle()adlı bir fonksiyon oluştur. Bu fonksiyonStartGame()çağrısı yapmadan önce oyuncunun araca girmesini beklemeli veMaybePlayerdeğişkenini araca giren oyuncu referansıyla güncellemelidir.OnBegin()fonksiyonunuStartGame()yerine bu fonksiyonu çağıracak şekilde güncelle.OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Oyunu başlatmak için yalnızca oyuncu araca ilk kez girdiğinde bildirim almak istiyoruz. # StartGameOnPlayerEntersVehicle olayı bekler ve sonra oynanış döngüsünü başlatır. StartGameOnPlayerEntersVehicle() StartGameOnPlayerEntersVehicle<private>()<suspends> : void = VehiclePlayer := VehicleSpawner.AgentEntersVehicleEvent.Await() Logger.Print("Player entered the vehicle") set MaybePlayer = option{player[VehiclePlayer]} StartGame()Oyuncunun araçtan çıktığı durum için bir olay işleyici ayarla.
privatebelirleyicisine sahipHandlePlayerExitsVehicle()adlı bir fonksiyon oluştur.OnBegin<override>()<suspends> : void = FindPlayer() SetupZones() # Araca girdikten sonra oyuncu dilediği zaman çıkabilir. # Oyuncuyu araca geri koymak için bu olay her gerçekleştiğinde saptamak isteriz. VehicleSpawner.AgentExitsVehicleEvent.Subscribe(HandlePlayerExitsVehicle) # Oyunu başlatmak için yalnızca oyuncu araca ilk kez girdiğinde bildirim almak istiyoruz. # StartGameOnPlayerEntersVehicle olayı bekler ve sonra oynanış döngüsünü başlatır. StartGameOnPlayerEntersVehicle() HandlePlayerExitsVehicle<private>(VehiclePlayer : agent) : void = Logger.Print("Player exited the vehicle. Reassigning player to vehicle") VehicleSpawner.AssignDriver(VehiclePlayer)
Fazla Pizzaları Kaldırma
Oyuncunun pizzaları haritaya düşürmemesi amacıyla yeni bir eşya aldığında oyuncudaki fazla pizzaları kaldırmak için aşağıdaki adımları izle:
Pizzaları oyuncunun çantasından kaldırmaktan sorumlu Eşya Kaldırıcı cihazına düzenlenebilir bir referans ekle.
@editable PizzaRemover<public> : item_remover_device = item_remover_device{}PickupDeliveryLoop()fonksiyonunda pizzaları oyuncu bir eşya aldıktan hemen sonra kaldır.Verseloop: if (PickupZone : base_zone = PickupZones[PickupLevel].SelectNext[]): PickupZone.ActivateZone() Sleep(0.0) PickupMarker.MoveMarker(PickupZone.GetTransform(), ?OverTime := 0.0) if (ValidPlayer := MaybePlayer?): PickupMarker.MapIndicator.ActivateObjectivePulse(ValidPlayer) <# This is the only defer we need for any PickupZone we activate. It will either deactivate the first PickupZone at the end of each outer loop, or it'll deactivate any later PickupZone. That's because the expression is evaluated at the end, when the PickupZone variable has been bound to a newer zone. #>