İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Godot'ta Oyun Nasıl Duraklatılır? Pause Menüsü ve Process Mode

godotta-oyun-nasil-duraklatilir-pause-menusu-process-mode
Bu yazıda neler var?
  1. Oyunun durması ile menünün çalışması neden ayrı şeyler?
  2. Process Mode seçenekleri: hangi düğüm için hangisi?
  3. Çalışan bir pause menüsü: sahne ağacı ve GDScript
  4. Yeniden başlatırken önce paused değeri neden false yapılmalı?
  5. Menü donuyor, düğme tıklanmıyor, arka plan sürüyor: adım adım teşhis
  6. Pause sistemini oyuna eklemeden önce dene: kısa test senaryosu

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:

  1. Oyuncu Esc'ye basar.
  2. Koşul kontrol edilir: oyun şu an duraklatılmış mı? Değilse paused true olur.
  3. Oyuncu ve düşman düğümleri donar; pause menüsü görünür.
  4. Menü, duraklatılmış durumda da çalıştığı için düğmeler tıklanır.
  5. Oyuncu Devam'a basar; paused false 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?

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çenekDuraklatılmış oyunda ne yaparTipik kullanım
InheritÜst düğümün modunu izler; bu ayar varsayılandırMenünün düğmeleri, etiketleri, oyuncunun alt düğümleri
PausableOyun duraklatılınca durur, duraklatılmamışken çalışırOyuncu, düşman, fizik nesneleri
When PausedYalnız oyun duraklatılmışken çalışırPause menüsü
AlwaysDuraklatılsa da duraklatılmasa da çalışırSayaç, müzik, pause'u kapatacak giriş denetleyicisi
DisabledHiçbir zaman işlenmezDevre 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ı?

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 = false yazı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.

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:

  1. Hareket sırasında: Oyuncuyu koştururken Esc'e bas. Devam'dan sonra hız ve konum kaldığı yerden sürmeli.
  2. Animasyon sürerken: Oyun karakteri ve arka plan animasyonları pause'da durmalı. Menü animasyonu ise oynamalı.
  3. Zamanlayıcı çalışırken: Timer düğü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.
  4. 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.
  5. Art arda Esc: Hızlı basışlarda menü iki kez açılmamalı, paused değeri tutarlı kalmalı.
  6. 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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara