Godot'ta oyunu duraklatmak için get_tree().paused değerini true yaparsın: SceneTree düzeyindeki bu anahtar açılınca, duraklatılabilir durumdaki düğümlerin işlemleri durur. Pause menüsünün bu sırada çalışabilmesi için menü düğümünün Process Mode ayarı When Paused olmalıdır. Bu yazıda önce bu iki ayrımı, sonra Process Mode seçeneklerini, ardından çalışan bir pause menüsünü kurup yaygın hataları teşhis edeceğiz.
Oyunun durması ile menünün çalışması neden ayrı şeyler?
Godot'ta duraklatma, oyunun her yerini tek tek susturan bir komut değildir. paused, SceneTree üzerinde duran genel bir anahtardır. Her düğümün kendi process_mode değeri ise o düğümün bu anahtara nasıl tepki vereceğini belirler. Resmî dokümantasyondaki "Pausing games and process mode" sayfasına göre, paused true olduğunda Process Mode'u Pausable olan düğümlerin _process ve _physics_process çağrıları ile fizik işlemleri durur.
Bu yüzden iki durum aynı anda doğru olabilir: oyuncu ve düşmanlar donmuştur, menü ise çalışır ve tıklanır. Menü düğümünün modu duraklatmadan etkilenmeyecek biçimde ayarlandığı için menü çalışmaya devam eder. Pause menüsü de duruyorsa sorun paused değerinde değil, menü düğümünün Process Mode ayarındadır.
Akışı bir durum ve geçiş problemi gibi düşünebilirsin:
- Oyuncu Esc'ye basar.
- Koşul kontrol edilir: oyun şu an duraklatılmış mı? Değilse
pausedtrue olur. - Oyuncu ve düşman düğümleri donar; pause menüsü görünür.
- Menü, duraklatılmış durumda da çalıştığı için düğmeler tıklanır.
- Oyuncu Devam'a basar;
pausedfalse olur, menü gizlenir, oyun kaldığı yerden sürer.
Burada iki durum (oynuyor, duraklatılmış), bir geçiş koşulu (Esc veya Devam) ve her durumda hangi parçaların çalışacağı sorusu var. Koddan önce bu akışı kâğıtta çizebilmek, hataları kod yazarken değil tasarım aşamasında yakalamanı sağlar. Durum, koşul ve akış kurma becerini ölçmek istersen dilden bağımsız Algoritmik Düşünme Testini deneyebilirsin.
Process Mode seçenekleri: hangi düğüm için hangisi?

Bir düğümün Process Mode ayarı Inspector'da Node bölümündeki Process altında durur. Betikten ise process_mode özelliğine Node.PROCESS_MODE_* sabitlerinden biri atanarak değiştirilir. Seçenekler şunlardır:
| Seçenek | Duraklatılmış oyunda ne yapar | Tipik kullanım |
|---|---|---|
| Inherit | Üst düğümün modunu izler; bu ayar varsayılandır | Menünün düğmeleri, etiketleri, oyuncunun alt düğümleri |
| Pausable | Oyun duraklatılınca durur, duraklatılmamışken çalışır | Oyuncu, düşman, fizik nesneleri |
| When Paused | Yalnız oyun duraklatılmışken çalışır | Pause menüsü |
| Always | Duraklatılsa da duraklatılmasa da çalışır | Sayaç, müzik, pause'u kapatacak giriş denetleyicisi |
| Disabled | Hiçbir zaman işlenmez | Devre dışı bırakılacak düğüm |
Karar çerçevesi
Oyuncu, düşman ve fizik nesneleri için Pausable ya da Inherit seç; pause'da donmaları gerekir. Yalnız pause sırasında görünüp çalışacak menü için When Paused kullan. Pause'dan etkilenmemesi gereken bir sayaç, müzik ya da pause'u tekrar kapatacak giriş denetleyicisi için Always uygundur. Hiç işlenmemesi gereken düğümde Disabled kullan.
Inherit'in mantığı sahne tasarımını kolaylaştırır: menü kökünü When Paused yaparsan alt düğümlerdeki düğmelerin hepsi Inherit ile bu modu izler. Her düğmeyi tek tek ayarlamana gerek kalmaz. Ayarı değiştirirken menünün yalnız kökünü ele al; çocukları Inherit'te bırak.
Eski öğreticilerdeki kodlarda ya da ekran görüntülerinde bu ayarın farklı adlarla geçtiğini görürsen, kendi sürümünün resmî dokümantasyonuna bakıp adları oradan doğrula.
Çalışan bir pause menüsü: sahne ağacı ve GDScript
Önce sahneyi kur. Burada kritik karar, Esc girişini dinleyen düğümün nereye konacağıdır.
Main (Node2D)
├── Player (CharacterBody2D)
├── Enemy (Node2D, sürekli dönen bir düğüm)
├── PauseController (Node) Process Mode: Always, script burada
└── CanvasLayer
└── PauseMenu (Control) Process Mode: When Paused, Visible: kapalı
├── Devam (Button)
└── YenidenBaslat (Button)
PauseController bilerek ayrı bir düğümdür. Main düğümünü Always yaparsan, varsayılan olarak üst düğümün ayarını devralan Player ve Enemy de duraklatma sırasında çalışmaya devam eder. Process Mode değerini Inspector'daki Node bölümünden ayarlarsın. Script ise PauseController düğümüne eklenir.
extends Node
@onready var menu: Control = $"../CanvasLayer/PauseMenu"
@onready var devam_dugmesi: Button = $"../CanvasLayer/PauseMenu/Devam"
func _ready() -> void:
devam_dugmesi.pressed.connect(_devam_et)
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("ui_cancel"):
get_tree().paused = not get_tree().paused
menu.visible = get_tree().paused
get_viewport().set_input_as_handled()
func _devam_et() -> void:
get_tree().paused = false
menu.visible = false
ui_cancel, Godot'un varsayılan Input Map'inde hazır gelen bir eylemdir ve Esc tuşuna bağlıdır; ayrıca eylem tanımlaman gerekmez. Proje ayarlarında bu eylemi değiştirdiysen Input Map'ten kontrol et. set_input_as_handled() aynı tuş basışının başka düğümlere ulaşmasını engeller.
Bu yapının mantığı şudur: paused true olunca Inherit veya Pausable durumundaki düğümlerin işlemesi durur. Menü ile denetleyici ise kendi ayarları sayesinde çalışmaya devam eder. Pause menüsü de duruyorsa sorun paused değerinde değil, menü düğümünün Process Mode ayarındadır. Esc ikinci kez algılanmıyorsa da aynı yere bak: denetleyici düğüm Always olmalıdır, yoksa oyun durduğu anda giriş dinlemesi de durur.
Beklenen davranış:
- Esc'ye basınca oyuncu ve düşman durur, menü görünür.
- Menüdeki düğmeler tıklanabilir ve hover efektleri çalışır.
- Esc'ye ikinci kez basmak ya da Devam düğmesi, menüyü gizler ve her şey kaldığı yerden sürer.
Yeniden başlatırken önce paused değeri neden false yapılmalı?

paused özelliği oyun nesnelerinde değil, SceneTree üzerinde durur. Sahne yeniden yüklense bile bu değer kendiliğinden sıfırlanmaz. Yeniden Başlat düğmesi menü açıkken sahneyi doğrudan yüklerse yeni sahne duraklatılmış başlar ve oyun donmuş görünür.
func _yeniden_baslat() -> void:
get_tree().paused = false
get_tree().reload_current_scene()
reload_current_scene() bir Error değeri döndürür; basit prototipte bu değeri kullanmasan da çağrı sorunsuz çalışır.
- Yanlış sıra: Yalnızca
reload_current_scene()çağrılır, sahne yenilenir ama oyuncu ve düşman hareket etmez. - Doğru sıra: Önce
paused = falseyazılır, ardından sahne yüklenir; oyun başlangıç durumundan akmaya başlar.
Aynı mantık Ana Menüye Dön düğmesi için de geçerlidir: başka bir sahneye geçmeden önce paused değerini false yapmak gerekir. Sahne geçişinin ayrıntıları bu yazının konusu değildir.
Menü donuyor, düğme tıklanmıyor, arka plan sürüyor: adım adım teşhis
Pause sorunlarının çoğu dört belirtiden birine benzer. Her birinde önce kontrol edilecek ayarı, sonra tek satırlık komutu ver.
1. Menü donuyor ya da düğmeler tepkisiz
Menü kökünün Process Mode değeri Inherit ise ebeveyn zincirini yukarı doğru izle. Zincir Pausable bir ata düğümde bitiyorsa menü de Pausable gibi davranır ve oyun durunca o da durur. Çocuk düğüm Inherit seçiliyken ebeveyninin modunu izler. Çözüm olarak menü kökünü When Paused yapabilirsin.
print(pause_menu.can_process(), get_tree().paused)
Pause açıkken ilk değer false çıkıyorsa menü işlenmiyor demektir.
2. Menü görünüyor ama fare tıklaması gitmiyor
Menünün üstünde, tam ekranı kaplayan bir ColorRect ya da Panel olabilir. mouse_filter değeri Stop ise bu düğüm fare olayını yutar. Pass olayı işleyip yukarı iletir, Ignore ise düğümü olay akışının dışında bırakır. Karartma katmanını Ignore yapmak çoğu zaman yeterlidir. Ayrıca düğmenin ya da atasının Disabled seçili olmadığına bak. Bu mod, oyun durmasa bile düğümü işlemez. Menünün ayrı bir CanvasLayer içinde olması çizim ve girdi sırasını netleştirir.
print(overlay.mouse_filter)
3. Oyuncu duruyor ama arka plan animasyonu sürüyor
Oynayan düğümü bul: AnimationPlayer, AnimatedSprite2D ya da bir parçacık düğümü olabilir. Hepsi birer düğüm olduğundan Process Mode ayarına sahiptir. Always seçilmiş olabilir. Menü sahnesinin altına koyduysan When Paused ya da Inherit olması da animasyonu pause sırasında oynatır. Tween için ayrı bir ayar vardır: bir düğümden create_tween() ile oluşturduğun tween o düğüme bağlıdır ve onun pause davranışını izler. set_pause_mode() ile bu davranışı değiştirebilirsin, bu yüzden tween'i ayrıca kontrol et.
print(arka_plan_anim.process_mode)
4. Esc ile pause kapanmıyor
Esc tuşunu ui_cancel eylemiyle dinleyen düğüm Pausable ise oyun durduğunda girdi almaz. Bu yüzden menüyü açan kod kapatamaz. Girdiyi When Paused ya da Always olan bir düğüme taşı.
print(input_node.can_process())
Pause sistemini oyuna eklemeden önce dene: kısa test senaryosu
Pause'u küçük bir test sahnesinde şu sırayla dene:
- Hareket sırasında: Oyuncuyu koştururken Esc'e bas. Devam'dan sonra hız ve konum kaldığı yerden sürmeli.
- Animasyon sürerken: Oyun karakteri ve arka plan animasyonları pause'da durmalı. Menü animasyonu ise oynamalı.
- Zamanlayıcı çalışırken:
Timerdüğümünün pause sırasında durup durmadığını gözle. Devam'dan sonra kalan süreden ilerlemeli. Menüde sürmesini istediğin bir sayaç varsa onun Process Mode değerini ayrı ayarla. - Ses çalarken: Müziğin menüde sürmesini mi, kesilmesini mi istediğine karar ver. Ses düğümünün Process Mode ayarını buna göre seçip sonucu dinleyerek doğrula.
- Art arda Esc: Hızlı basışlarda menü iki kez açılmamalı,
pauseddeğeri tutarlı kalmalı. - Yeniden Başlat: Menüden yeniden başlattıktan sonra oyuncu hareket etmeli ve oyun donmamalı.
Bu adımlar geçtiyse pause sistemini asıl projene taşıyabilirsin. Oyun mantığını ve kod okuma becerini ölçmek istersen ücretsiz Python, Java ve algoritma testleri seviyeni görmene yardımcı olur.
Pause hatasının çoğu tek bir ayardan çıkar. Önce neyin durduğunu, sonra durması gerekmeyenin hangi düğüm olduğunu bul. Process Mode zincirini yukarı doğru okuduğunda hangi düğümün neden donduğu genellikle netleşir.