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_device
sınıfına,public
belirleyicisine sahipPickupMarker
adlı düzenlenebilir birobjective_marker
ekle.@editable PickupMarker<public> : objective_marker = objective_marker{}
PickupDeliveryLoop()
işlevinin başlangıcındaPickupMarker
objesiyle ilişkili Harita Göstergesi cihazını etkinleştir ve işlev mevcut olduğunda cihazı devre dışı bırakmak için birdefer
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()
işlevini çağır.race: 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) <# Etkinleştirdiğimiz PickupZone için gereken tek geciktirme (defer) budur. Her dış döngünün sonunda ilk PickupZone bölgesini devre dışı bırakacak veya sonraki herhangi bir PickupZone’u devre dışı bırakacaktır. Bunun nedeni, ifadenin en sonda PickupZone değişkeni daha yeni bir bölgeye bağlandığında değerlendirilmesidir. #> defer: PickupZone.DeactivateZone() PickupZone.ZoneCompletedEvent.Await() Logger.Print("Picked up", ?Level := log_level.Normal)
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()
işlevinin dönüş türünüint
olarak değiştir vereturn PendingScore
ifadesini ekle.AddPendingScoreToTotalScore<public>() : int = set TotalGameScore += PendingScore defer: set PendingScore = 0 UpdateUI() return PendingScore
- Teslimatta 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_device
sınıf tanımına,public
belirleyicisine sahipDeliveryBonusSeconds
adlı düzenlenebilir birfloat
ekle.# Bir teslimat yapıldığında geri sayım süreölçerine kaç saniye ekleneceği. @editable DeliveryBonusSeconds<public> : float = 20.0
- Bonus süreyi hesaplamak için teslim
block
ifadesini 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 hata
- Oynanış 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:
public
belirleyicisine sahip araç oluşturma yeri cihazına düzenlenebilir bir referans oluştur.@editable VehicleSpawner<public> : vehicle_spawner_atk_device = vehicle_spawner_atk_device{}
private
vesuspends
belirleyicilerine sahipStartGameOnPlayerEntersVehicle()
adlı bir fonksiyon oluştur. Bu fonksiyonStartGame()
çağrısı yapmadan önce oyuncunun araca girmesini beklemeli veMaybePlayer
değ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.
private
belirleyicisine sahipHandlePlayerExistsVehicle()
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()
işlevinde pizzaları oyuncu bir eşya aldıktan hemen sonra kaldır.loop: 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) <# Etkinleştirdiğimiz PickupZone için gereken tek geciktirme (defer) budur. Her dış döngünün sonunda ilk PickupZone bölgesini devre dışı bırakacak veya sonraki herhangi bir PickupZone’u devre dışı bırakacaktır. Bunun nedeni, ifadenin en sonda PickupZone değişkeni daha yeni bir bölgeye bağlandığında değerlendirilmesidir. #> defer: PickupZone.DeactivateZone() PickupZone.ZoneCompletedEvent.Await() Logger.Print("Picked up", ?Level := log_level.Normal) <# Pizzaların üst üste yığılmasını ve yığın dolduktan sonra yere düşmesini önlemek için pizza alımlarını oyuncu çantasından kaldırıyoruz. #> if (RemovingPlayer := MaybePlayer?): PizzaRemover.Remove(RemovingPlayer) # İlk alımdan sonra teslim bölgesini etkinleştirebiliriz. # Alma seviyesini ve ScoreManager değerini güncelle. if (PickupLevel < MaxPickupLevel): set PickupLevel += 1 else: Logger.Print("Seçilecek bir sonraki PickupZone bulunamıyor.", ?Level := log_level.Error) return # PickupDeliveryLoop döngüsünden doğan hata