Godot Engine Eğitim Serisi - Bölüm 8: Skor, Yeniden Oynama ve Kullanıcı Arayüzü (HUD)
Godot 2D oyununda skor, HUD ve yeniden oynama: CanvasLayer, Label, Timer ve grup sistemi ile game over mekaniği. Türkçe rehber.
Oyunumuz mekanik olarak çalışıyor ve oynanabilir durumda. Ancak skor göstergesi, oyun bittiğinde “Yeniden Oyna” seçeneği (Game Over mesajı) ve bir başlangıç butonu olmadan oyun tam bir deneyim sunmaz. Bu bölümde, HUD (Heads-Up Display) sahnesiyle kullanıcı arayüzünü oluşturacak, eski düşmanları temizleyerek yeniden oynama mantığını kuracak ve son olarak ses efektleriyle oyunumuza ruh katacağız.
HUD (Kullanıcı Arayüzü) Sahnesini Kurmak
Arayüz elemanlarının oyun dünyasındaki nesnelerin (oyuncu veya düşmanlar) altında kalmaması için onları ayrı bir katmanda çizmemiz gerekir.
Yeni bir sahne oluşturun, “Other Node” butonuna tıklayın ve kök node olarak
CanvasLayerekleyip adınıHUDolarak değiştirin.HUDnode’unun altına şu çocuk node’ları ekleyin:- ScoreLabel (Label): Skoru gösterecek.
- Message (Label): “Game Over” veya “Get Ready!” gibi mesajları gösterecek.
- StartButton (Button): Oyunu başlatacak.
- MessageTimer (Timer): Mesajların ekranda ne kadar süre kalacağını yönetecek (Wait Time: 2, One Shot: On).
Özel Font ve Konumlandırma Ayarları
Varsayılan fontları daha şık bir fontla değiştireceğiz.
ScoreLabelnode’unu seçin, Inspector panelinden Theme Overrides > Fonts sekmesindeki “Load” seçeneği ile oyun varlıklarındakiXolonium-Regular.ttfdosyasını yükleyin.
Theme Overrides > Fonts altından özel fontu yüklüyoruz
- Hemen altındaki Theme Overrides > Font Sizes değerini
64olarak ayarlayın. (Aynı işlemiMessageveStartButtoniçin de tekrarlayın).
Font boyutunu 64 olarak ayarlıyoruz
Konumlandırma (Anchor Presets):
- ScoreLabel: Text alanına
0yazın. Horizontal/Vertical Alignment ayarlarını Center yapın. Anchor Preset’i Center Top olarak seçin. - Message: Text alanına
Dodge the Creeps!yazın. Alignment ayarlarını Center yapın. Autowrap Mode’u Word olarak ayarlayın (uzun metinlerin alt satıra inmesi için). Anchor Preset’i Center yapın. - StartButton: Text alanına
Startyazın. Anchor Preset’i Center Bottom olarak seçin ve Y pozisyonunu biraz yukarı (örneğin580) taşıyın.
Anchor Presets ile node’ları kolayca konumlandırabiliriz
HUD Scripti ve Sinyaller
HUD node’una bir script ekleyin. Bu script, mesajları göstermek ve skoru güncellemekten sorumlu olacaktır.
Öncelikle oyun başladığında butonun gizlenmesi ve ana sahneye haber verilmesi için kendi özel sinyalimizi tanımlamalıyız:
1
signal start_game
Kodun Satır Satır Açıklaması:
signal: Godot’ya yeni bir sinyal tanımladığımızı belirtir.start_game: Bu bizim özel sinyalimize verdiğimiz isimdir. Adından da anlaşılabileceği gibi “oyunu başlat” emrini ifade edecek. Arayüzde (HUD) START butonuna basıldığında bu sinyali yayacağız (emit) ve ana oyun sahnesi (Main) bu sinyali duyduğu anda kargaşayı, düşmanları vs. sıfırlayıp pırıl pırıl yeni bir oyun başlatacak.
Sonrasında şu üç temel fonksiyonu yazabilirsiniz:
show_message(text):Messageetiketinin metnini günceller, görünür yapar veMessageTimer‘ı başlatır.update_score(score):ScoreLabel‘ın metnini (Text) string formatında oyuncunun anlık skoruna eşitler.show_game_over(): Bu fonksiyon, 2 saniye boyunca “Game Over” yazısını gösterir. Süre bitimindeawait get_tree().create_timer(1.0).timeoutkomutunu kullanarak 1 saniyelik bir gecikme ekler ve ardındanStartButton‘ı tekrar görünür hale getirerek başlık ekranına (“Dodge the Creeps!”) geri döner.
Sinyalleri Bağlamak: StartButton‘ın pressed sinyalini HUD scriptinize bağlayarak içinde start_game.emit() çağrısını yapın ve butonu gizleyin. Aynı şekilde MessageTimer‘ın timeout sinyalini bağlayarak süresi dolduğunda Message etiketini gizleyin.
Main Sahnesiyle Entegrasyon ve Yeniden Oynama (Replay)
Arayüzümüz hazır olduğuna göre main.tscn sahnesini açıp HUD sahnenizi bir instance (örnek) olarak ana sahneye ekleyin.
HUDinstance’ını seçin ve sağ paneldeki Signals sekmesinden yeni oluşturduğunuzstart_gamesinyalini, Main scriptinizdekinew_game()fonksiyonuna bağlayın.
Main sahnesi tüm bileşenlerle eksiksiz hâlde
- Main scriptinizdeki
_ready()fonksiyonunun içinde bulunannew_game()çağrısını silin. Böylece oyun siz “Start” butonuna basana kadar başlamayacaktır. game_over()fonksiyonunuzun içineshow_game_over()çağrısını ekleyin ve_on_score_timer_timeout()içerisindeupdate_score(score)çağrısı yaparak skoru güncelleyin.
Eski Düşmanları Temizlemek (Grup Sistemi)
Oyun bitip yeniden başlatıldığında, ekrandaki eski düşmanlar (mob’lar) kalmaya devam eder. Bunları tek bir komutla temizlemek için Godot’nun grup (group) sistemini kullanmalıyız.
mob.tscnsahnesini açın, kök node’u seçip Groups sekmesindenmobsadında yeni bir grup oluşturup node’u bu gruba dahil edin.
Groups sekmesinden mob’ları bir gruba ekleyeceğiz
“mobs” adında yeni bir grup oluşturuyoruz
Mob sahnesi artık “mobs” grubuna üye
- Main scriptindeki
new_game()fonksiyonunun içine şu satırı ekleyin:
1
get_tree().call_group("mobs", "queue_free")
Kodun Satır Satır Açıklaması:
get_tree(): Tüm oyun ağacını yani sahnedeki her şeyi kapsayan ana yöneticiye ulaşırız..call_group(...): “Bir gruba ait olan herkesi bul ve onlara şu komutu ver / çağır” anlamına gelir."mobs": İlk parametre aradığımız grubun adıdır. Hatırlarsan az önce düşmanları “mobs” (kalabalıklar/yaratıklar) grubuna dahil etmiştik."queue_free": İkinci parametre ise gruptaki node’lara gönderilen emirdir.queue_free, Godot’da “kendini yavaşça bellekten sil ve yok ol” demektir. Yani oyun alanındaki 10 tane düşman varsa, bu tek satır kod hepsini bulur ve aynı anda “yok olun” emri vererek ekranı yeni oyun için tertemiz yapar.
Son Dokunuşlar: Ses, Arka Plan ve Dışa Aktarma
Oyun deneyimini tamamlamak için birkaç estetik dokunuş yapalım:
- Arka Plan Rengi:
Mainsahnesine birColorRectnode’u ekleyin ve sahne ağacında en üste taşıyarak (diğer node’ların arkasında çizilmesi için) Inspector’dan istediğiniz bir rengi seçin. Anchor ayarlarından Full Rect‘i seçerek tüm ekranı kaplamasını sağlayın. - Ses Efektleri ve Müzik:
Mainsahnesine iki adetAudioStreamPlayernode’u ekleyip isimleriniMusicveDeathSoundyapın. Oyun varlıklarındakiHouse In a Forest Loop.oggdosyasını müziğe,gameover.wavdosyasını ölüm sesine atayın.new_game()çağrıldığında müziği başlatın,game_over()çağrıldığında müziği durdurup ölüm sesini oynatın.
💡 Bilgilendirme: Müziğin kesintisiz çalması için Stream dosyanızın yanındaki oka tıklayıp “Make Unique” dedikten sonra Loop kutusunu işaretlemeyi unutmayın.
Stream’i önce “Make Unique” yapıp ardından Loop’u etkinleştiriyoruz
- Klavye Kısayolu: Oyuna her seferinde fareyle tıklamak yerine “Enter” tuşuyla başlamak için; Project Settings > Input Map üzerinden
start_gameadında yeni bir eylem oluşturup Enter tuşunu atayın. ArdındanStartButtonnode’unun Inspector panelindeki Shortcut özelliğine bu eylemi bağlayın.
Input Map’e “start_game” eylemi eklendi ve Enter tuşuna atandı
StartButton’ın Shortcut özelliğine yeni bir resource ekliyoruz
InputEventAction olarak “start_game” eylemini seçiyoruz
Konuyla ilgili Youtube videosu aşağıdadır…
Tebrikler!
2D eğitim serisini ve ilk oyununuzu tamamen bitirdiniz. Oyununuzu dışa aktarmak (Export) ve arkadaşlarınızla paylaşmak için projenizi çalıştırılabilir dosya (.exe, vb.) olarak ayarlayabilirsiniz.
Bir sonraki rehberimizde 3D dünyanın kapılarını aralayacak ve “Squash the Creeps!” oyununa başlayacağız!