Menü létrehozása

A Godot Engine alapjai - II. Arkanoid
2021-06-12 · 17:47
Először egy egyszerű menüt fogunk készíteni. Szerencsére a Godot Engine elég sok előre elkészített elemet tartalmaz, hogy megkönnyítse a munkánkat.


A Főmenü létrehozása


Az előző részből megismert módon hozzunk létre New Project-et és nevezzük el pl. "Arkanoid tutorial"-nak. A Project Settings-ben (General - Display - Window) ismét válasszuk a 2d és a keep lehetőséget, a méret pedig legyen 1280×720.

Ha megnyílt az új projektünk, akkor bal oldalon a scene tree-ben válasszuk ki a User Interface-t, és a létrejövő Control node-ot nevezzük el "Menu"-nek és mentsük is el. Adjunk hozzá egy VBoxContainer node-ot  - [Ctrl + A] - és nevezzük el "Gombok"-nak. A fenti ikonsoron kattintsunk a Layout-ra, a lenyíló menüben, pedig a Full Rect-re.

válasszuk a Full Rect lehetőséget


A jobb oldali panelen állítsuk az Alignment-et Center-re, a Margin - Left értékét 200-ra, Right értékét -200-ra, a Custom Constants - Seperation értékét pedig 50-re.
a Gombok node beállításai


A Gombok node-hoz adjunk hozzá egy Button-t, és állítsuk be a jobb oldali panelen, (a Rect almenüben) a Min Size - y értékét 100-ra.
 
Töltsük le a Montserrat betűtípust (vagy akár sajátot is használhatunk, lényeg, hogy legyenek benne ékezetes karakterek). A linkelt csomagban elég sokféle variáció található, válasszunk ki egyet és másoljuk be a játék főkönyvtárába.

A Custom Fonts-nál válasszuk a New Dynamic Font lehetőséget, majd kattintsunk rá ismét. A lenyíló menüben válasszuk a Font-ot, majd kattintsunk az empty-re aztán a Load-ra és válasszuk ki a betűtípusunkat. Kettővel feljebb, a Settings-nél adhatunk meg nagyobb méretet, pl. 40-et.
Ha sikerült beállítanunk, akkor eggyel feljebb, a Font mező jobb oldalán kattintsunk a lefelé mutató nyílra és válasszuk a Save lehetőséget, és mentsük el pl. "menu_font.tres" néven, így máshol is fel tudjuk majd használni.

Hozzunk létre két másolatot a Button-ról - [Ctrl + D]. Nevezzük el a három gombot: "Jatek", "Beallitasok" és "Kilepes". Az adott gombokon, a jobb oldali panel Text mezőjébe írt szöveg fog megjelenni - itt már használhatunk ékezetes karaktereket is. Legyenek ezek értelemszerűen: Játék, Beállítások és Kilépés.

Menu scene tree



A Főmenü scriptelése I.


Jelöljük ki a Menu nevű node-ot és adjunk hozzá egy script-et (a felette lévő tekercs ikonnal, vagy jobb egérgombbal kattintva az Attach Script lehetőséget választva). Állítsuk a Template-et Empty-re, majd kattintsunk a Create gombra. Ne írjunk még semmit, helyette kattintsunk a Jatek nevű node-ra, majd a jobb oldali panelen váltsunk át a Node fülre és kattintsunk duplán a pressed() Signal-ra.
pressed() signal


Válasszuk ki a Menu node-ot (mást nem is tudunk, mivel csak ehhez van script hozzáadva), majd kattintsunk a Connect gombra.
pressed() signal küldése a Menunek


Ismételjük ezt meg a másik két gombbal is. Ha ez megvan, akkor valahogy így kéne kinéznie a kódnak:

extends Control

# ha a Játék gomb meg lett nyomva
func _on_Jatek_pressed():
    pass # Replace with function body.


# ha a Beállítások gomb meg lett nyomva
func _on_Beallitasok_pressed():
    pass # Replace with function body.


# ha a Kilépés gomb meg lett nyomva
func _on_Kilepes_pressed():
    pass # Replace with function body.

Láthatjuk, hogy az így létrejövő új függvény - func - mindig tartalmazza a küldő node nevét, és azt, hogy melyik signal-t küldte. Létrehozáskor a fent látható Receiver Method mezőben adhatunk neki saját nevet is, de erre általában nincs szükség.

Megtehetjük azt is, hogy több különböző signal Receiver Method-jának is ugyanazt a nevet adjuk, így ugyanazt a függvényt több különböző signal is hívhatja.

Ha most elindítjuk a játékot (miután megadtuk main scene-nek a Menu-t), akkor már tudunk kattintani a gombjainkra, de még nem fog történni semmi. Zárjuk be az ablakot és térjünk vissza a script-hez. Először a Kilépés kódját fogjuk megírni, mert az a legegyszerűbb, és egyből látható is a hatása. Módosítsuk a kódot a következőképpen:

func _on_Kilepes_pressed():
    # kilépés
    get_tree().quit()

Ennyi. Próbáljuk ki.


A Beállítások menü létrehozása


A következő gomb a Beállítások, ez már izgalmasabb lesz. Először is hozzunk létre egy új scene-t (szintén User Interface), nevezzük el BeallitasokMenu-nek és mentsük el.

Adjunk a BeallitasokMenu-höz is egy VBoxContainer-t "Gombok" néven ugyanazokkal a beállításokkal, mint az előző (a Margin lehet nagyobb). Ehhez adjunk hozzá egy CheckBox node-ot és a Min Size - y értékét ennek is állítsuk 100-ra. A Custom Fonts-nál kattintsunk az empty-re, majd a Load-ra és válasszuk ki a korábban elmentett menu_font.tres fájlt. A Custom Constants - Hseparation értéke legyen 20.

A betűtípus méretének állításától a jelölőnégyzet mérete nem fog változni, de a Custom Icons mezőben használhatunk egyedi jelölőnégyzetet.
 
Duplikáljuk a CheckBox-ot. Nevezzük el őket "Hangok" és "TeljesKepernyo" néven. A Text mezőikben pedig Hangok és Teljes képernyő legyen. A Hangok node Pressed mezőjét pipáljuk be.

Kattintsunk ismét a Gombok node-ra és adjunk hozzá egy Button-t "Vissza" néven, a Text mezőbe is írjuk be ugyanezt, valamint a Min Size - y értéke itt is legyen 100. A Custom Fonts-nál ehhez is adjuk hozzá a menu_font.tres nevű fájlt.

BeallitasokMenu scene tree



A Főmenü scriptelése II.


Térjünk vissza a Menu script-hez és módosítsuk a Beállítások részt:

func _on_Beallitasok_pressed():
    # a zárójelben van a fájl elérési útvonala
    # "res://" a játék főkönyvtára, ebből nem léphetünk ki
    get_tree().change_scene("res://BeallitasokMenu.tscn")

Próbáljuk ki! Ha minden jól ment, akkor a Beállítások-ra kattintva átkerülünk a BeallitasokMenu-be. Mivel ehhez még nem írtunk script-et, ezért itt egyelőre nem is tudunk csinálni semmit. Zárjuk be az ablakot.


A Beállítások menü scriptelése


Adjunk hozzá egy script-et a BeallitasokMenu node-hoz és a korábban használt módszerrel hozzunk létre egy-egy pressed() signal-t a két CheckBox-ból és  Vissza gombból. Ha ez megvan, valahogy így fog kinézni a kódunk:

extends Control


# ha meg lett nyomva a Hangok jelölőnégyzet
func _on_Hangok_pressed():
    pass # Replace with function body.


# ha meg lett nyomva a Teljes képernyő jelölőnégyzet
func _on_TeljesKepernyo_pressed():
    pass # Replace with function body.


# ha meg lett nyomva a Vissza gomb
func _on_Vissza_pressed():
    # a zárójelben van a fájl elérési útvonala
    # "res://" a játék főkönyvtára, ebből nem léphetünk ki
    get_tree().change_scene("res://Menu.tscn")


A script egyelőre így marad, majd későbbi fejezetekben folytatjuk.