Doğru açılır pencereyi seçin
Bir açılır pencere oyunun akışını keser. Birini seçmeden önce tek bir soruyu yanıtlayın: oyun devam etmeden önce oyuncunun yanıt vermesi gerekiyor mu? Evet ise engelleyin. Hayır ise asla engellemeyin — oyuncunun istemediği bir haber için oyunu durduran bir kart, oyununuzu kapattırmanın en hızlı yoludur.
- Yanıtı olan bir soru — satın al, sil, ayrıl, üzerine yaz →
GoDialogs.confirm(). Görülüp onaylanacak bir bilgi →alert(). Birkaç seçenekten biri →choose(). - Kendine ait bir ekran — ayarlar, karakter sayfası, mağazadaki bir eşya → ekranın ortasında bir
GoSurface. - Uzun bir liste ya da bir yönetim sayfası — çanta, posta, arkadaşlar → telefonda alttan
GoSheet, geniş ekranda yandanGoDrawer. - Az önce basılan şeyle ilgili bir şey — bir eşyanın özellikleri, eylemleri → hemen yanında
GoPopoverya daGoContextMenu. - Oyun sürerken verilebilecek haberler — kaydedildi, düşürüldü, davet edildin →
GoSnackbar,GoNoticeya daGoPromptCard. Bunlar ekranı asla ele geçirmez. - Denetimleri öğretmek →
GoCoachMark. Geliştirirken hileler →GoConsole.
Tüm açılır pencereler bir bakışta
| Açılır pencere | Oyunu durdurur mu | Geri / Escape | Dışarıya dokunuş | Ne için kullanılır |
|---|---|---|---|---|
GoDialogs confirm · alert | Evet | Kapatır — confirm false yanıtlar, alert geri döner | Yalnızca dismiss_on_scrim ile kapatır | Yanıt gerektiren sorular |
GoDialogs.choose | Evet | Kapatır — -1 yanıtlar | Yalnızca dismiss_on_scrim ile kapatır | Birkaç seçenekten birini seçmek |
GoSurface | Evet | En üsttekinin kapanmasını ister | dismiss_on_scrim ile kapanmayı ister | Kendi pencereleriniz |
GoSheet | Evet | Tüm alt sayfayı kapatır | Kapatır | Çanta, mağaza listesi, posta |
GoDrawer | Evet | Yalnızca Android Geri | Kapatır | Geniş ekranda yan liste |
GoPopover | Kapanana dek | Kapatır | Kapatır — ve daha ileri gitmez | Eşya ve yetenek ayrıntıları |
GoCombobox listesi | Kapanana dek | Kapatır | Kapatır | Arama yapan bir seçim listesi |
GoContextMenu · dropdown · select | Motorun menüsü | Motorun menüsü | Kapatır | Eylemler, kısa listeler |
GoSnackbar | Hayır | — | Oyuna ulaşır | Kaydedildi · Geri al · Yeniden dene |
GoPromptCard | Hayır | — | Oyuna ulaşır | Bir davet, bir takas isteği |
GoNotice | Asla | — | Oyuna ulaşır | HUD üzerinde sabit bir satır |
GoBanner | Hayır — sayfanın içindedir | — | — | "Çevrimdışısınız. Yeniden dene" |
GoCoachMark | Yalnızca kendi kartı | Turu bitirir | Oyuna ulaşır | İlk açılış turu |
GoConsole | Yalnızca kendi paneli | Escape tuşu kapatır | Oyuna ulaşır | Hata ayıklama komutları |
Her birinin hangi katmanda açıldığı ve sıranın neden böyle olduğu Katmanlar, Geri ve girdi bölümünde.

GoDialogs
GoSurface
GoSheet
GoDrawer
GoPopover
GoContextMenu
GoSnackbar
GoPromptCard
GoCoachMark
GoConsoleBu sayfadaki her görüntü aynı küçük oyundur — sol üstte can ve mana, sağ üstte altınlar, altta bir joystick ve üç
hızlı slot — default_dark ile, üstünde tek bir açılır pencere açık. Aynı açılır
pencere on dört görünümün hepsinde →
Bir açılır pencerenin anatomisi
gohud'daki engelleyen açılır pencerelerin neredeyse tamamı — iletişim kutuları, alt sayfalar, popover'lar, combobox
listesi ve kendi pencereleriniz — tek bir düğümdür: GoSurface. Parçalarını bir kez öğrenin, hepsini bilirsiniz.

| Parça | Nedir | Nasıl erişilir |
|---|---|---|
| Katman | Açılır pencerenin üzerinde durduğu CanvasLayer. Numarası neyi örteceğine karar verir. | GoSurface için sizin seçiminiz; diğerlerinde yerleşik (tablo) |
| Perde | Arkadaki her şeyin üstüne serilen örtü. Kartı ıskalayan dokunuşları yakalar. | scrim_transparent, dismiss_on_scrim, temanın scrim rengi |
| Kart | Pencerenin kendisi — temanın panel yüzü; görünüme göre yuvarlak, pahlı, dövme ya da jöle. | card, alpha |
| Başlık satırı | İsteğe bağlı bir geri düğmesi, başlık (en fazla iki satır, sonrası "…") ve kapatma düğmesi. | set_title() · set_title_key() · set_back() · close_enabled · show_header |
| Araç çubuğu | Başlık satırının altında sabit bir sıra — bir arama alanı, filtre chip'leri. Kullanana dek gizlidir. | toolbar |
| Gövde | Kayan kısım. İçeriği buraya koyun. | body · scroll_body · clear() |
| Durum satırı | Gövde ile alt bilgi arasında sabit bir satır — "Ad denetimi başarısız", "Kaydediliyor…". | set_status_text() · set_status_key() · clear_status() |
| Alt bilgi | Altta sabitlenmiş düğmeler. Kullanana dek gizlidir. | footer |
toolbar, durum satırı ve footer kullanın; gövde kayarken onlar yerinde kalır.
await ettiğiniz iletişim kutuları
GoDialogs sorar ve bekler. Tek düğüm, üç soru — ve yanıt aynı satıra geri gelir; böylece kod,
oyuncunun yaşadığı sırayla okunur.
var dialogs := GoDialogs.new()
add_child(dialogs)
if await dialogs.confirm("Buy the starter pack?", "300 gems for a sword, a shield and 10 potions.",
"Buy", "Not now"):
buy_starter_pack()

confirm()
confirm(…, true) — geri alınamaz
alert()
choose()
ActionLayout.HORIZONTALÜç soru
confirm(title, body, ok_text := "", cancel_text := "", extra := "",
args := {}, destructive := false) -> bool
alert(title, body, ok_text := "", extra := "", args := {}) # beklemek için await edin
choose(title, options: Array, cancel_text := "", translate := false) -> int
confirm_key(…) · alert_key(…) # çeviri anahtarları
| Çağrı | Döndürdüğü | Ne için kullanılır |
|---|---|---|
confirm() | true ya da false | Evet ya da hayır — satın al, sil, ayrıl, üzerine yaz. |
alert() | hiçbir şey — beklemek için await edin | Oyuncunun görmesi gereken bir şey: bir ödül, kopan bir bağlantı. |
choose() | seçeneğin dizini ya da -1 | Birkaç seçenekten biri. Bir seçenek bir String ya da {text, icon, danger, subtitle} olabilir. |
confirm_key() · alert_key() | yukarıdaki gibi | Aynısı, çeviri anahtarlarıyla — iletişim kutusu açıkken dil değişirse sözcükler de değişir. |
Boş düğme etiketleri kitin kendi sözcüklerine döner (GoConfig.text_keys içindeki confirm, cancel).
extra gövdeye yeni bir satırda eklenir. args, başlıktaki ve gövdedeki {placeholders}
yer tutucularını doldurur: confirm("Buy {item}?", "It costs {price} gold.", "Buy", "", "", {"item": name, "price": 300}).
Her çıkış yolunun bir yanıtı var
| Oyuncu… | confirm | alert | choose |
|---|---|---|---|
| Tamam'a ya da bir seçeneğe basarsa | true | geri döner | seçeneğin dizini |
| İptal'e basarsa | false | — | -1 |
| ×, Escape ya da Android Geri'ye basarsa | false | geri döner | -1 |
perdeye dokunursa (yalnızca dismiss_on_scrim ile) | false | geri döner | -1 |
GoDialogs düğümü ağaçtan ayrılırsa | false | geri döner | -1 |
Bu yüzden await sonrasındaki kod her zaman çalışır — sahne iletişim kutusunun altında değişse bile hiçbir yanıt askıda kalmaz.
Geri alınamayan eylemler
Geri alınamayacak bir şey için destructive = true verin. Tamam düğmesi dolgulu
Tone.DANGER_SOLID düğmesine dönüşür — her görünümde kırmızı üstünde beyaz; tonlanmış bir tehlike etiketi ise açık
bir temada okunaklı kalmak için neredeyse siyaha kadar koyulaşmak zorunda kalırdı. Pencere yeniden kullanıldığı için ton her
çağrıda sıfırlanır.
if await dialogs.confirm("Delete this save?", "Slot 2 — Aria, level 12. This cannot be undone.",
"Delete", "Keep it", "", {}, true):
delete_save(2)
Düğme yerleşimi
action_layout | Ne yapar |
|---|---|
VERTICAL (varsayılan) | Düğmeler alt alta, tam genişlikte. Her dil için güvenli — uzun bir Almanca ya da Rusça etiket asla sıkışmaz. |
HORIZONTAL | Tek sıra, her biri yarı genişlikte. |
AUTO | Yalnızca iki etiket de kartın yarısına tek satırda sığdığında tek sıra; aksi hâlde alt alta. Dil ya da boyut değişince yeniden karar verilir. |
action_gap düğmeler arasındaki boşluk, body_gap ise üstlerindeki boşluktur — soru ile seçimin iki
ayrı parça olarak okunması için bunu düğme boşluğundan geniş tutun. Yalnızca tek bir iletişim kutusu için, açmadan önce
set_next_action_layout() çağırın. Bir uyarının tek düğmesi her zaman tam genişliği alır.
Aynı anda bir tane
Biri açıkken çağrılan ikinci bir confirm() anında false döndürür — bir iletişim kutusu kazara başka
birinin üstüne yığılmaz. queue_when_busy açıksa bunun yerine sırasını bekler; alert() her zaman bekler.
queue_limit (8) sırayı sınırlar; sıra taşarsa en eski istek false ile yanıtlanır.
pending() bekleyen istekleri sayar, clear_pending() hepsini false ile yanıtlar.
choose() asla sıraya girmez: bir iletişim kutusu zaten açıksa -1 döndürür.
Telefon ve masaüstü
choose() Android ve iOS'ta başparmağın olduğu yerde, alttan bir sayfa olarak açılır; masaüstünde ise ortada
bir kart olarak. Bir onay max_width (420dp) ile sınırlanır ve ortalanır. layer_index,
max_width ve diğer dışa aktarılan özellikleri add_child çağrısından önce ayarlayın; düğüm ağaca girdiğinde uygulanırlar.
var picked := await dialogs.choose("Sort the bag by", [
{"text": "Newest first", "icon": GoIconSet.CLOCK},
{"text": "Rarity", "icon": GoIconSet.STAR},
{"text": "Drop everything", "icon": GoIconSet.TRASH, "danger": true}])
if picked >= 0:
sort_bag(picked)
GoSurface — kendi pencereniz
Bir açılır pencere bir sorudan fazlası olduğunda — ayarlar, karakter sayfası, satın alınacak bir eşya — onu
GoSurface üzerine kurun. Güvenli alan, sanal klavye, sabit satırlar, kaydırma, Geri, odak ve yeniden boyutlandırma hazırdır.
var layer := CanvasLayer.new()
layer.layer = 50
add_child(layer)
var window := GoSurface.new()
window.set_title("Settings")
window.close_requested.connect(layer.queue_free)
window.body.add_child(GoStyle.toggle("Music", false))
window.body.add_child(GoStyle.slider(0.0, 1.0, 0.05))
var row := GoStyle.row()
row.add_child(GoStyle.button("Cancel", window.request_close))
row.add_child(GoStyle.button("Save", save_and_close, GoStyle.Tone.PRIMARY))
window.footer.add_child(row)
window.footer.visible = true
layer.add_child(window)
close_requested yayar. Pencereyi
gizlemek ya da bellekten silmek sahibi olan ekranın işidir — "kapat"ın kaydetmek mi, vazgeçmek mi yoksa önce sormak mı demek
olduğunu yalnızca o bilir.
Üç yerleşim

CENTER — onaylar, ayarlar
BOTTOM — listeler, yönetim sayfaları
ANCHOR — bir denetimin yanında
CENTER penceresinde bir GoDatePickerANCHOR için anchor_control gerekir. anchor_min_width sığıyorsa kart denetimin sağına
yerleşir, sığmıyorsa daha geniş tarafa, o da olmazsa ekranın içine; üstte daha çok yer varsa yukarı doğru açılır. Hareket eden
bir anchor'ı her karede izler. Boyutunu anchor_width (320) ve anchor_max_height (520) belirler.
Ne kadar büyür
| Ölçü | Kural | Neyle değiştirilir |
|---|---|---|
| Alan | Güvenli alan, eksi sanal klavye, eksi ekran kenar boşluğu (16dp; kısa kenarın %10'undan asla fazla değil). | — |
| Genişlik | Dikeyde alanın %94'ü, yatayda %72'si; en fazla 480dp. | max_width · GoConfig.surface_width_ratio_* |
| Yükseklik | İçerik kadar (fit_content), alanın %68'ine kadar; üst sınır %72. Yeniden boyutlandırılamayan ortalanmış bir kart, kaydırma gerekmesin diye %94'e kadar büyüyebilir. | height_ratio · max_height_ratio · max_height |
| Yoğunluk | compact açıksa, ekran 420dp'den kısaysa (yan tutulmuş bir telefon) ya da içerik sığmıyorsa sıkışık: daha az iç boşluk, daha küçük aralıklar, daha küçük bir başlık. İkisini de ölçer ve sığanlar arasından daha ferah olanı tutar — titreme olmaz. | compact |
| Yeniden boyutlandırma | resizable açıkken başlık bir tutamaç olur: onu %30 ile üst sınır arasında sürükleyin. Sonucu height_changed(ratio) bildirir. | resizable |
Üst sınırı aşan bir oran geri kırpılır; hata ayıklama derlemesinde bir kez uyarı verilir. Sanal klavye kartı yukarı iter ve odaktaki alanı görünür hâle kaydırır; güvenli alan kartı Android ve iOS'ta çentikten ve hareket çubuğundan uzak tutar.
Özellikler
| Özellik | Varsayılan | Ne yapar |
|---|---|---|
placement | CENTER | CENTER, BOTTOM ya da ANCHOR |
dismiss_on_scrim | GoConfig.dismiss_on_scrim (false) | Perdeye dokunuş kapanmayı ister. Kartın içinde başlayan bir sürükleme istemez. |
scrim_transparent | false | Oyunu görünür bırakır — perde dışarıdaki dokunuşları yine de yakalar. |
close_enabled | true | × gösterir; Escape ve Geri'nin kapanmayı istemesine izin verir. |
show_header · scroll_body · resizable | true · true · false | Başlık satırı, kayan gövde, sürükleme tutamacı. |
fit_content · compact | true · false | İçeriğe göre boyutlanır; sıkışık başlar. |
fade_in | GoConfig.surface_fade_in (false) | Kart açılırken belirerek gelir. reduce_motion altında anında. |
alpha | -1 (temanınki) | Kart yüzünün opaklığı, oran olarak. Yalnızca yüz solar — metin asla. |
initial_focus | yok | Açılışta odaklanan denetim. |
add_child öncesinde ayarlayın: scrim_transparent, show_header, resizable ve
scroll_body pencere ağaca girdiğinde uygulanır. dismiss_on_scrim, close_enabled,
fade_in ve initial_focus ise anlık okunur.
Sinyaller ve çağrılar
| Ad | Nedir |
|---|---|
close_requested | ×, Escape, Android Geri ya da perdeye dokunuş — ve request_close(). Yalnızca en üstteki pencere yayar. |
back_requested · set_back(action) | Sayfaları olan bir pencere için başlık satırındaki geri düğmesi. Boş bir Callable onu gizler. |
height_changed(ratio) | Tutamaç sürüklendikten sonra. |
is_top() · GoSurface.is_any_open() | Geri'yi alan pencere bu mu — hiç açık pencere var mı. |
relayout() | Hemen yeniden yerleştirir. Bir boyutlandırma özelliğini değiştirmek bunu zaten sizin yerinize yapar. |
Alt sayfalar ve çekmeceler
Yer isteyen bir liste, dik tutulan bir telefonda başparmağın olduğu yerden, yani alttan gelir; tablette ya da masaüstünde ise yandan gelir, çünkü orada bir alt sayfa oyunun üstünü kaplardı.

GoSheet
GoDrawer · LEFT
GoDrawer · RIGHTGoSheet — alttan gelen sayfalar
var sheet := GoSheet.new()
add_child(sheet)
func show_bag(items: Array) -> void:
sheet.open("Bag")
var search := GoStyle.line_edit("Search the bag…")
search.text_changed.connect(filter_bag)
sheet.toolbar().add_child(search)
sheet.toolbar().visible = true
for item in items:
sheet.body.add_child(GoStyle.list_button(GoIconSet.BOX, item.name, show_item.bind(item),
Color.TRANSPARENT, item.description, false, GoIconSet.CHEVRON_RIGHT))
sheet.add_footer(GoStyle.button("Close", sheet.close, GoStyle.Tone.PRIMARY))
- İçinde
BOTTOMyerleşimli, yeniden boyutlandırılabilir birGoSurfacetaşıyan birCanvasLayer'dır (katman 10) — böylece HUD'ın üstünde durur ve oyuncu onu sürükleyerek uzatabilir. open(title)yeni bir sayfa başlatır: gövdeyi, araç çubuğunu ve geri düğmesini temizler,add_footer()ile eklenenleri bellekten siler. Aynı alt sayfada başka bir sayfa göstermek için yeniden çağırın;set_back()başa dönüş için bir geri düğmesi gösterir.open_key()bir çeviri anahtarı alır.close()onu gizler — bellekten silinmez, bu yüzden bir sonrakiopen()anında açılır. Ne zaman olduğunuclosedvepage_changedbildirir.height_ratio(0.6) açıldığı yüksekliktir;max_height_ratioüst sınırı yükseltir;dismissable(true) perdeye dokununca onu kapatır.
set_back() kullanılan bir iç sayfada bile — bir sayfa geri yalnızca
ekrandaki geri düğmesi götürür. Geri bir adım geri gitmeliyse sheet.surface üzerindeki close_requested
sinyalini kendiniz ele alın.
GoDrawer — yandan
var drawer := GoDrawer.new()
drawer.side = GoDrawer.Side.LEFT
drawer.follow_text_direction = true # başlangıç tarafı: solda, Arapçada sağda
add_child(drawer)
drawer.body.add_child(GoNavBar.drawer_list([{"icon": GoIconSet.HOME, "text": "Town"},
{"icon": GoIconSet.MAP, "text": "World map"}], 0, go_to))
drawer.open("Menu")
- Katman 80. Ekran genişliğinin %42'si (
width_ratio),min_width(320dp) ilemax_width(420dp) arasında — telefonda ekranın çoğunu kaplar; orada alt sayfanın daha iyi bir seçim olmasının nedeni budur. - Panel ekranın kenarına dayanır; yalnızca içeriği güvenli alana göre içeri çekilir, böylece yuvarlak bir köşe ilk satırı asla kırpmaz.
LEFT, Arapçada bile ekranın solu demektir. Asıl mesele "başlangıç tarafı" olduğundafollow_text_direction'ı açın; nereye yerleştiğinieffective_side()söyler.open(title)gövdeyi korur — bir kez doldurun.set_title("")başlık satırını gizler.motion_seconds(0.2) kayarak gelmesini sağlar;reduce_motionbunu anlık yapar.
drawer.close()'u kendi tuş atamanızdan çağırın — ve GoSurface.is_any_open()'ın çekmeceyi saymadığını
unutmayın; drawer.is_open()'a sorun.
Bir denetimin yanındaki kartlar ve menüler
Oyuncunun az önce bastığı şey, ekranın ortasında değil, parmağın hemen yanında bir yanıtı hak eder.

GoPopover
GoContextMenu
GoStyle.dropdown()
GoStyle.select()
GoComboboxGoPopover — basılan şeyin üstünde bir kart
slot.pressed.connect(func() -> void:
var card := GoStyle.item_card({"icon": GoIconSet.POTION, "title": "Health potion",
"subtitle": "Heals 50 HP · 12 left"}, false)
GoPopover.open(slot, card, {"width": 280}))
Katmanı, anchor'ı ve kapanıştaki temizliği önceden bağlanmış bir ANCHOR yüzeyi — her oyunun tekrar tekrar yazdığı
o on satır. Aynı anda bir tane: ikincisini açmak ilkini kapatır, çünkü üst üste yığılan kartlar ekranı gömer ve hangisinin
hangi slota ait olduğu anlaşılmaz. Perde saydamdır — ekipmanı karşılaştırmak için açılan bir kart ekipmanı karartmamalıdır —
ama dışarıdaki ilk dokunuşu yine de yakalar; bu dokunuş kartı kapatır ve daha ileri gitmez.
| Seçenek | Varsayılan | Ne yapar |
|---|---|---|
title | "" | × içeren bir başlık satırı. Boşsa başlık satırı olmaz. |
width · max_height | 320 · 520 | Kartın boyutu. |
dismissable | true | Dışarıya dokunuş kartı kapatır. |
compact · alpha · translate | false · -1 · false | Sıkışık aralıklar, yüz opaklığı, çeviri anahtarı olarak başlık. |
layer | 95 | Açıldığı CanvasLayer. |
GoPopover.close() ve GoPopover.is_open() statiktir. open() yüzeyi döndürür — anchor ağaçta
değilse null; bu yüzden await shown.close_requested yazmadan önce denetleyin.
dismissable = false verilmiş ve başlığı olmayan bir kartı
ekrandaki hiçbir şey kapatmaz — yalnızca Escape, Geri ya da kendi çağrınız.
GoContextMenu — uzun basış ve sağ tık
var menu := [
{"text": "Use", "icon": GoIconSet.POTION, "action": use},
{"separator": true},
{"text": "Drop", "icon": GoIconSet.TRASH, "action": drop, "danger": true}]
GoContextMenu.attach(slot, menu)
var more := GoStyle.icon_button(GoIconSet.MORE, Callable(), -1, &"more")
more.pressed.connect(func() -> void: GoContextMenu.open_at(more, menu))
- Sağ tık onu hemen açar. Yarım saniye (
HOLD_SECONDS) basılı tutulan bir parmak onu açar; 12dp'den fazla kıpırdamak iptal eder — böylece bir listeyi kaydırmak asla menü açmaz. - Bir öğe
{text, action, icon, disabled, checked, separator, danger, translate}biçimindedir. Girdiler neye basıldığına bağlıysa dizi yerine birCallablegeçin; menü her açıldığında çağrılır. dangermetnin önüne "⚠ " koyar — motorun menüsü öğelerini ancak hepsini birden renklendirebilir.- Motorun
PopupMenu'sudur veGoStyle.style_popup()tarafından giydirilir. Açık bir yüzey olarak sayılmaz.
⋯ düğmesiyle eşleştirin (yukarıdaki gibi open_at()) ya da bir kez bir rehber işaretiyle öğretin.
Açılır menüler, seçiciler ve bölünmüş düğme
var sort := GoStyle.dropdown("Sort", ["Highest score", "Most wins", {"text": "Friends only", "disabled": true}],
func(index: int) -> void: sort_board(index))
var quality := GoStyle.select(["Low", "Medium", "High", "Ultra"], "Quality")
quality.item_selected.connect(func(index: int) -> void: settings.quality = index)
var send := GoSplitButton.make("Send", send_now, ["Send later", "Save as draft"])
Üçü de motorun açılır menüsünü açar: dropdown() bir eylem çalıştıran bir MenuButton'dır,
select() bir değer tutan bir OptionButton, GoSplitButton ise bir ana eylem artı okunun
üstünde bir menüdür (chosen(index)). Menüler bilerek tamamen opak tutulur — kendi işletim sistemi penceresinde
gösterilen bir menü yarı saydam pikselleri siyaha çevirir.
GoCombobox — arama yapan bir liste
var friend := GoCombobox.make(friend_names, -1, "Find a friend")
friend.picked.connect(func(index: int) -> void: invite(friend_names[index]))
Basıldığında 96. katmanda, saydam perdeli, sabitlenmiş bir liste açar. search_threshold (8) girdiden itibaren bir
arama alanı belirir ve odağı alır; büyük/küçük harfe bakmadan metnin ya da ipucunun herhangi bir yerinde eşleşir, sonuç boşsa
bunu da söyler. Listenin boyutunu list_width (0 = düğmenin genişliği, en az 180dp) belirler.
Oyunu asla durdurmayan açılır pencereler
Oyuncunun oynarken okuyabileceği haberler. Hiçbirinde perde yoktur; kartın kendisi dışında herhangi bir yere dokunuş oyuna gider.

GoSnackbar
GoNotice
GoPromptCard
GoStyle.tooltip_node()GoSnackbar — Geri al düğmeli bir mesaj
var snack := GoSnackbar.new()
add_child(snack)
if await snack.post({"text": "Dropped {name}", "args": {"name": item.name}, "icon": GoIconSet.TRASH,
"actions": ["Undo"], "seconds": 5.0}) == 0:
restore(item)
post() anahtarı | Ne yapar |
|---|---|
text · title · args · translate | Mesaj, isteğe bağlı kalın bir satır, {placeholders}, çeviri anahtarları. |
tone · icon | Vurgu rengi (GoTheme.SUCCESS, WARNING…) ve bir simge. |
actions · closable | Düğmeler — String'ler ya da {text, action} — ve bir ×. |
seconds | Ekranda ne kadar kalacağı. Negatif: temanın notice_duration_ms değeri. 0: kapatılana dek — o zaman ona bir düğme verin. |
post() basılan düğmenin dizinini, süre dolduysa ya da kapatıldıysa -1 döndürür. Gönderiler sıraya
girer (queue_limit 4; taşınca en eskisi -1 ile düşürülür) ve gösterilirken aynı metin yeniden gönderilirse yalnızca
zamanlayıcısı yenilenir. Altta (ya da placement ile üstte), güvenli alanın ve sanal klavyenin üstünde, 90. katmanda
durur — bir çekmecenin üstünde de okunur. tap_to_dismiss (açık) ile düğmesi olmayan bir karta dokunmak onu kapatır;
kartın dışına dokunuş her zaman oyuna ulaşır. show_text() ve show_key() tek satırlık biçimleridir.
GoNotice — HUD üzerinde bir satır
var notice := GoNotice.new()
hud_corner.add_child(notice)
notice.show_text("Game saved", GoTheme.SUCCESS)
notice.custom_minimum_size.x = notice.preferred_width(340)
Kendiniz yerleştirdiğiniz sade bir panel — bir GoHudAnchor içinde, bir köşede, istediğiniz yerde. Ne girdi ne de
odak alır; bu yüzden üstüne basmak alttaki düğmeye ulaşır ve yeni bir mesaj eskisinin yerini alır. Ona bir genişlik verin:
preferred_width(limit) kısa metnin doğal genişliğini döndürür, uzun metni ise limit içinde satıra kaydırır.
set_content() metin yerine herhangi bir denetimi gösterir.
GoPromptCard — bekleyebilen bir soru
var spot := GoHudAnchor.new()
spot.spot = GoHudAnchor.Spot.TOP_CENTER
spot.reserve_space = false
spot.avoid_peers = true # can çubuklarını örtmek yerine altlarına in
hud.add_child(spot)
var invite := GoPromptCard.new()
spot.add_child(invite)
invite.set_icon(GoIconSet.USERS, Color.TRANSPARENT, true)
invite.set_title("Party invite from Ann")
invite.set_subtitle("Dragon's Lair · 3 / 4 members")
invite.set_actions([{"text": "Accept", "action": accept, "primary": true},
{"text": "Decline", "action": invite.hide}])
invite.fit_width(340)
invite.show()
get_tree().create_timer(15.0).timeout.connect(invite.hide)
- Gizli başlar —
show()çağırın. Kendi zamanlayıcısı yoktur; soru zaman aşımına uğrayacaksa bir tane ekleyin. - Düğmeleri onu kapatmaz — buna eylemler karar verir. × (
set_closable(true))closedyayar. fit_width(width)genişliği ayarlar ve yüksekliği yazı tipinden önceden hesaplar; böylece ona göre yerleştirilen hiçbir şey bir kare sonra zıplamaz.- Yüzü
hud_alpha'yı izler — bir pencere değil, HUD'ın bir parçasıdır.
GoBanner ve ipuçları
GoBanner.make("You're offline.", [{"text": "Retry", "action": reconnect}], GoIconSet.WARNING) sayfanın kendisinde,
içeriğin üstünde durur ve asla zaman aşımına uğramaz; "keep": true verilmedikçe bir düğme onu kapatır.
GoStyle.tooltip_node(text), _make_custom_tooltip()'tan döndürmeniz gereken şeydir — plakayı motor
(TooltipPanel), metni gohud çizer ve 260dp'yi geçen metin satıra kaydırılır. İpuçları fare içindir; oyuncunun
ihtiyaç duyduğu bir şeyi asla bir ipucunun arkasına saklamayın.
Turlar ve konsol

GoCoachMark
GoConsoleGoCoachMark — gerçek denetimlerde bir tur
var tour := GoCoachMark.new()
tour.keep_clear = [top_bar]
tour_layer.add_child(tour)
tour.finished.connect(func(completed: bool) -> void: save.tutorial_done = true)
tour.start([{"target": bag_button, "title": "Bag", "body": "Everything you pick up lands here."},
{"target": map_button, "title": "Map", "body": "Tap to open the full map."}])
- Gerçek denetimin çevresinde bir halka ve yanında bir kart. Hedefe basmak turu ilerletir (onun
pressedsinyali ya da adımdaki"signal"); İleri ve Atla kartın üstündedir. Gizli bir hedef atlanır. - Kart ekranın ortasından (
avoid_center_band), HUD anchor'larından vekeep_clear'dan uzak durur. - Herhangi bir
GoSurfaceaçıkken tur gizlenir ve bekler. Geri ya da Escape onufinished(false)ile bitirir. - Kendi katmanı yoktur — onu en son ekleyin ya da HUD'ın üstündeki bir katmana koyun.
GoConsole — geliştirirken hileler
var console := GoConsole.new()
add_child(console)
console.register("give", "give <item> <count>", func(args: PackedStringArray) -> String:
return "gave %s x%s" % [args[0], args[1]] if args.size() >= 2 else "give <item> <count>")
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed(&"dev_console"): console.toggle()
Katman 200 — her şeyin üstünde, böylece bir iletişim kutusunun üzerinde hata ayıklayabilirsiniz — ve ağaç duraklatılmışken de çalışmaya devam eder. Bir palet siz yazdıkça komut önerir; Yukarı ve Aşağı tuşları geçmişte gezinir; Escape onu kapatır. Yerleşik bir tuşu yoktur: kendinizinkini atayın.
debug_only (açık) onu yayın derlemesinde engeller — hem open() hem run().
Oyuncunun eline geçen hile komutları bir oyunun ekonomisini ilk günde bitirir.
Katmanlar, Geri ve girdi
Bir şey açıkken oyuncunun neye dokunabileceğine üç kural karar verir: en üstte ne var, Geri kimin, bir dokunuşu kim alır.
En üstte ne durur
| Katman | Orada ne durur | Neyle ayarlanır |
|---|---|---|
| 5 | HUD'ınız (sizin seçiminiz) | — |
| 10 | GoSheet | CanvasLayer.layer |
| ~50 | Kendi GoSurface pencereleriniz, bir duraklatma menüsü | kendi CanvasLayer'ınız |
| 80 | GoDrawer | CanvasLayer.layer |
| 90 | GoSnackbar | layer_index |
| 95 | GoPopover | "layer" seçeneği |
| 96 | GoCombobox listesi | — |
| 100 | GoDialogs | layer_index |
| 200 | GoConsole | layer_index |
Sıra bilinçlidir: bir snackbar az önce olanı bildirir, bu yüzden bir çekmecenin üstünde okunur; bir popover az önce basılan şeye aittir, bu yüzden onun üstünde durur; bir iletişim kutusu soru sorar ve ikisini de örter; konsol her şeyi örter, çünkü geri kalan her şey ters gittiğinde açtığınız şey odur.
Geri kimin
- Yalnızca en üstteki pencere yanıt verir. Açık yüzeyler arasında en yüksek katmandaki (eşitse ağaçta en son gelen)
Escape'i, oyun kumandasının iptal tuşunu (
ui_cancel), Android Geri'yi ve perdeye dokunuşları alır. Üst üste açılmış pencereler teker teker kapanır, asla birlikte değil. - Android Geri bir kare sonra ele alınır; böylece tek bir basış asla iki pencereyi kapatamaz.
- Geri'nin sahibi olan herhangi bir şey açıkken Android Geri uygulamadan çıkmaz (
GoBackPolicysahipleri sayar ve sonuncusu kapanıncaquit_on_go_back'i geri yükler). Geri'yi alan kendi açılır pencerenizGoBackPolicy.acquire()verelease()çağırmalıdır —_exit_treeiçinde de. - Bir yüzey açıkken çekmece, rehber işareti turu ve form kenara çekilir — Geri önce yüzeye gider.
GoConfig.close_on_back(açık) yüzeyler için açma/kapama anahtarıdır.
Dokunuşu kim alır
- Bir yüzey tüm ekranı kaplar ve girdiyi durdurur — saydam bir perde de. O açıkken alt katmanlardaki hiçbir şeye basılmaz; üstündeki katmanlara (bir snackbar) yine basılabilir.
- Fare tekerleği ve iki parmakla yakınlaştırma hareketleri de pencerede durur: bir listenin sonunu geçecek kadar kaydırmak oyunu asla kaydırmaz.
- Denetimlerden geçmeyen oyun girdisi — hareket için
_unhandled_input, bir kamera sürüklemesi — beklemelidir:if GoSurface.is_any_open(): return. Bu, iletişim kutularını, alt sayfaları, popover'ları ve combobox'ı kapsar; çekmeceyeis_open()ile ayrıca sorun. - Snackbar, bildirim, soru kartı ve rehber işareti girdiyi yalnızca kendi kartlarında alır; geri kalan her yerde girdi oyuna gider.
Odak
İşaretçiyle açılan bir pencere hiçbir şeye odaklanmaz — bir dokunuşta odak halkası yanıp sönmez. Klavyeyle ya da oyun
kumandasıyla açıldığında odağı kapatma düğmesi (ya da initial_focus) alır. Pencere açıkken odak onun içinde kalır,
pencere kapanınca da odağı önceden elinde tutan denetime geri döner. İletişim kutuları her seferinde Tamam'a odaklanır.
Oyunu duraklatmak
Ağacı duraklatmak açılır pencereleri de duraklatır — yalnızca konsol çalışmaya devam eder. Bir duraklatma menüsü için katmanına
process_mode = PROCESS_MODE_ALWAYS verin; o zaman oyun dururken pencere, düğmeleri ve Geri çalışmaya devam eder.
Her görünümde aynı açılır pencere
Bu sayfanın başındaki onay, aynı oyunun üstünde, yalnızca ön ayar değiştirilerek. Kod birebir aynıdır — gerisini tema, kaplama ve simgeler yapar.

default_dark
default_light
scifi_dark
scifi_light
medieval_dark
medieval_light
material_light Yeni
material_dark Yeni
kids_light Yeni
kids_dark Yeni
comic_light Yeni
comic_dark Yeni
arcade_light Yeni
arcade_dark YeniHer görünüm neyi değiştirir
| Görünüm | Pencere | Başlığı ve düğmeleri |
|---|---|---|
| Varsayılan | Yuvarlak (18dp), yumuşak bir gölge, oyunun üstünde %80 opak | Sade bir başlık ve ×; birincil düğmeler basılınca kalkar ve çöker |
| Bilimkurgu | Neon kenarlı ve ışımalı pahlı köşeler; kenar vurgu rengiyle tonlanır | Köşelik biçiminde odak işaretleri |
| Ortaçağ | Dövme bir çerçeve — demir ve deri ya da parşömen — perçinler ve köşe süsleriyle | Cinzel başlıklar |
| Material 3 | 28dp köşeler, 24dp iç boşluk, tamamen opak | Roboto ile 24sp bir başlık; 48dp hedef içinde 40dp plakalı hap biçimli düğmeler |
| Kids | Yumuşak gölgeli bir jöle şeker kart, tamamen opak | Güneş sarısı bir başlık kurdelesi (gece nane yeşili), yuvarlak şeker bir kapatma düğmesi, basılınca ezilen düğmeler |
| Comic | Kalın bir mürekkep çizgisi ve sert bir gölge, tamamen opak | Sarı bir başlık kutusu, mürekkeple çizilmiş yuvarlak bir kapatma düğmesi, basılınca gölgesi kaybolan düğmeler |
| Arcade | Kalın bir pano — soluk bir iç zeminin çevresinde renkli bir çerçeve — tamamen opak | Beyaz, mürekkep çizgili bir başlığı olan altın sarısı bir başlık şeridi, yuvarlak kırmızı bir kapatma tuşu, basılınca geri fırlayan boyalı tuşlar |
Bir açılır pencereyi kaplamayla giydirmek
Kaplama, bir Theme'in erişemediği parçalara karar verir. Açılır pencerelerin çağırdığı kancalar bunlardır — onları kendi
GoSkin alt sınıfınızda ezin; varsayılan olarak hiçbir şey yapmazlar.
| Kanca | Neyi giydirir |
|---|---|
title_plate_box() · title_plate_ink() · title_plate_min_size() | Bir pencere başlığının arkasındaki plaka. Başlık onun üstünde ortalanır ve tek satırda kalmak için en küçük boyuta (15) kadar küçülür. |
dress_close_button(button) | Pencerenin × düğmesi — Kids onu yuvarlak bir şekere, Comic mürekkeple çizilmiş bir diske, Arcade yuvarlak kırmızı bir tuşa çevirir. |
dress_title(label) | Pencerenin başlık etiketi — Arcade beyaz başlığın çevresine mürekkep çizgisi çeker. |
press_feedback(control) | gohud'un yaptığı bir düğmeye parmak değdiği anda çalışır — Kids düğmeyi ezer, Arcade geri fırlatır. |
floating_box() · notice_box() · drawer_box() · banner_box() · overlay_box() | Soru kartlarının ve rehber kartlarının, snackbar'ların ve bildirimlerin, çekmecenin, banner'ların ve konsolun yüzleri. |
coach_ring_box() · draw_coach_pointer() | Turun halkası ve işaretçisi. |
Ne kadar saydam
Her açılır pencere türü kendi opaklığını izler; böylece bir HUD kartı hafif kalırken bir iletişim kutusu katı kalabilir:
pencereler, alt sayfalar, iletişim kutuları, popover'lar ve combobox panel_alpha'yı; çekmece ve rehber kartı
card_alpha'yı; soru kartları ve konsol hud_alpha'yı; snackbar'lar ve bildirimler
notice_alpha'yı; menüler popup_alpha'yı izler. Material ve Kids hepsini opak yapar; Comic de öyle, yalnızca soru kartları ve konsol %92'dir; Arcade de öyle, yalnızca bu ikisi %94'tür. Tek bir türü
GoConfig.container_alpha_overrides ile, hepsini container_alpha ile (bir oran — 0.95), tek
bir pencereyi de kendi alpha değeriyle geçersiz kılın. Yalnızca yüz solar; metin asla saydamlaşmaz.
Opaklık ayrıntılı olarak →
Her açılır pencereyi biçimlendiren ayarlar
GoConfig (GoUi.config) alanları. Birkaçı pencere oluşturulurken kopyalanır; bu yüzden
onları arayüzü kurmadan önce ayarlayın — ya da değiştirdikten sonra GoUi.refresh() çağırın.
| Alan | Varsayılan | Ne yapar |
|---|---|---|
surface_max_width · surface_max_height | 480 · 700 | Bir pencerenin ulaşabileceği en büyük boyut. |
surface_height_ratio · surface_max_height_ratio | 0.68 · 0.72 | Olağan yükseklik ve üst sınır (aynı zamanda sürükleme sınırı). |
surface_fit_max_height_ratio | 0.94 | İçeriğe göre boyutlanan ortalanmış bir kartın kaydırmaya geçmeden önce ne kadar büyüyebileceği. |
surface_width_ratio_portrait · …_landscape | 0.94 · 0.72 | Alanın payı olarak genişlik. |
dismiss_on_scrim | false | Perdeye dokunuş pencereleri ve iletişim kutularını kapatır. Pencere oluşturulurken kopyalanır. |
surface_fade_in · fade_seconds | false · 0.14 | Pencerelerin belirerek gelmesi ve bunun hızı. |
close_on_back | true | Escape, ui_cancel ve Android Geri en üstteki pencereyi kapatır. |
close_button_visual | 36 | × düğmesinin ne kadar büyük göründüğü — dokunma hedefi 48dp kalır. |
suppress_pointer_focus_ring | true | Pencere dokunuşla ya da fareyle açıldığında odak halkası gösterilmez. |
container_alpha · container_alpha_overrides | -1 · {} | Tüm yüzlerin ya da türe göre (GoTheme.BOX_*) opaklık. |
reduce_motion | false | Belirme, kayma, nabız ya da ezilme olmaz. |
min_touch_size | 48 | Soru kartı ve rehber işareti düğmelerinin yüksekliği. |
respect_safe_area | true | Pencereleri çentikten ve hareket çubuğundan uzak tutar. |
text_keys · text_overrides | — | Kitin kendi sözcükleri: kapat, geri, onayla, iptal, ileri, bitti, atla, ara, boş… |
sound_cues · titreşim | — | GoFeedback'in açıldı, kapandı, onaylandı, iptal edildi ve dokunuldu anlarında çaldığı şey. |
Tarifler
Kopyalayın, yapıştırın, sözcükleri değiştirin. Buradaki her çağrı kaynak koda karşı denetlenmiştir.
Fiyatı içinde yazan bir satın alma
func buy(item_name: String, price: int) -> void:
if await dialogs.confirm("Buy {item}?", "It costs {price} gold.", "Buy", "", "",
{"item": item_name, "price": price}):
purchase(item_name)
Kaydet düğmesi sabit bir ayarlar penceresi
func open_settings() -> void:
var layer := CanvasLayer.new()
layer.layer = 50
add_child(layer)
var window := GoSurface.new()
window.set_title("Settings")
window.dismiss_on_scrim = true
window.close_requested.connect(layer.queue_free)
window.body.add_child(GoStyle.section("Sound", false))
window.body.add_child(GoStyle.toggle("Music", false))
window.body.add_child(GoStyle.slider(0.0, 1.0, 0.05))
var row := GoStyle.row()
row.add_child(GoStyle.button("Cancel", window.request_close))
row.add_child(GoStyle.button("Save", func() -> void:
save_settings()
layer.queue_free(), GoStyle.Tone.PRIMARY))
window.footer.add_child(row)
window.footer.visible = true
layer.add_child(window)
Neyin yanlış olduğunu söyleyen bir form
var field := GoField.make("Name", GoStyle.line_edit(), "3–12 letters")
window.body.add_child(field)
create_button.pressed.connect(func() -> void:
if name_is_taken():
field.set_error("That name is taken")
window.set_status_text("Name check failed", GoTheme.DANGER)
else:
window.clear_status()
create_character())
Alt sayfada bir tarih
sheet.open("Delivery date")
var picker := GoDatePicker.make({"year": 2026, "month": 10, "day": 14}, func(date: Dictionary) -> void:
delivery = date
sheet.close())
picker.min_date = GoDatePicker.today()
sheet.body.add_child(picker)
Bir duraklatma menüsü
func pause() -> void:
get_tree().paused = true
var layer := CanvasLayer.new()
layer.layer = 50
layer.process_mode = Node.PROCESS_MODE_ALWAYS # oyun duraklatılmışken de çalışmaya devam eder
add_child(layer)
var menu := GoSurface.new()
menu.set_title("Paused")
menu.close_requested.connect(func() -> void:
get_tree().paused = false
layer.queue_free())
menu.body.add_child(GoStyle.button("Resume", menu.request_close, GoStyle.Tone.PRIMARY))
menu.body.add_child(GoStyle.button("Settings", open_settings))
menu.body.add_child(GoStyle.button("Quit to title", quit_to_title, GoStyle.Tone.DANGER))
layer.add_child(menu)
Açılır pencereleri bekleyen oynanış
func _unhandled_input(event: InputEvent) -> void:
if GoSurface.is_any_open() or drawer.is_open():
return
handle_gameplay(event)
Tuzaklar
- Bir
GoSurfacekendini asla bellekten silmez.close_requested'i bağlayın, yoksa × hiçbir şey yapmaz. add_childsonrasında ayarlanan seçenekler —scrim_transparent,show_header,resizable,scroll_bodyveGoDialogs'unlayer_indexilemax_widthdeğerleri — uygulanmaz.- İkinci bir
confirm()anındafalsedöndürür. İki soru çakışabiliyorsaqueue_when_busy'yi açın. - Enter onaylar. Odak Tamam'dadır, geri alınamayan eylemlerin iletişim kutularında da.
- Alt sayfada Geri, alt sayfayı kapatır, iç sayfayı değil.
- Escape bir çekmeceyi kapatmaz,
is_any_open()da onu görmez. - Bir popover ya da combobox listesi kapanana dek oyunu engeller, saydam bir perdeyle bile — ve
dismissable = falseverilmiş, başlığı olmayan bir popover'ı ekrandaki hiçbir şey kapatmaz. - Bir soru kartı gizli başlar ve zaman aşımı yoktur.
seconds: 0verilmiş ve düğmesi olmayan bir snackbar asla gitmez. Üstelik varsayılan olarak kartına gelen dokunuşları yakalar.- Kimsenin bilmediği bir uzun basış, kimsenin kullanmadığı bir özelliktir. Yanında bir
⋯da gösterin. - Duraklatılmış bir ağaç açılır pencerenizi de duraklatır. Katmanında
PROCESS_MODE_ALWAYSkullanın. - Genişliği verilmemiş bir bildirim en dar hâline büzülür —
preferred_width()kullanın. - Snackbar'da asla soru sormayın, iletişim kutusunda asla bilgi vermeyin. Görmezden gelinen bir soru kaybolur gider; haber oyunu durdurmamalıdır.