DungeonCrawler/main_menu.gd
Andre f7c4922784 Menü-Musik spielt bis Spielstart weiter
Musik-Player wird beim Klick auf Spielen an den World-Node
übergeben statt gestoppt. Erst bei Klassenauswahl wird die
Musik beendet. So läuft die Intro-Musik auch während der
Charakterauswahl.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 20:40:54 +01:00

189 lines
5.9 KiB
GDScript

# MainMenu.gd
# Hauptmenü mit Spielstart und Einstellungen
extends CanvasLayer
signal start_game
@onready var background = $Background
@onready var main_panel = $Background/MainPanel
@onready var settings_panel = $Background/SettingsPanel
@onready var play_btn = $Background/MainPanel/ButtonPanel/VBoxContainer/PlayBtn
@onready var settings_btn = $Background/MainPanel/ButtonPanel/VBoxContainer/SettingsBtn
@onready var quit_btn = $Background/MainPanel/ButtonPanel/VBoxContainer/QuitBtn
# Settings Controls
@onready var resolution_option = $Background/SettingsPanel/VBoxContainer/ResolutionRow/ResolutionOption
@onready var window_mode_option = $Background/SettingsPanel/VBoxContainer/WindowModeRow/WindowModeOption
@onready var vsync_check = $Background/SettingsPanel/VBoxContainer/VsyncRow/VsyncCheck
@onready var msaa_option = $Background/SettingsPanel/VBoxContainer/MSAARow/MSAAOption
@onready var back_btn = $Background/SettingsPanel/VBoxContainer/BackBtn
# Bevorzugte Reihenfolge: Hintergrund mit Titel, dann ohne, dann Banner
const BG_WITH_TITLE = "res://assets/Icons/Background+GameName.png"
const BG_PLAIN = "res://assets/Icons/Background.png"
const BANNER_PATH = "res://assets/Icons/Banner.png"
const MENU_MUSIC = "res://assets/sounds/intro7.mp3"
var _music_player: AudioStreamPlayer
# Auflösungen
const RESOLUTIONS = [
Vector2i(1280, 720),
Vector2i(1366, 768),
Vector2i(1600, 900),
Vector2i(1920, 1080),
Vector2i(2560, 1440),
Vector2i(3840, 2160),
]
func _ready():
get_tree().paused = true
process_mode = Node.PROCESS_MODE_ALWAYS
main_panel.visible = true
settings_panel.visible = false
# Hintergrundbild laden: zuerst mit Titel, dann ohne, dann Banner
if ResourceLoader.exists(BG_WITH_TITLE):
background.texture = load(BG_WITH_TITLE)
elif ResourceLoader.exists(BG_PLAIN):
background.texture = load(BG_PLAIN)
elif ResourceLoader.exists(BANNER_PATH):
background.texture = load(BANNER_PATH)
# Menü-Musik starten
if ResourceLoader.exists(MENU_MUSIC):
_music_player = AudioStreamPlayer.new()
_music_player.stream = load(MENU_MUSIC)
_music_player.volume_db = -6.0
_music_player.finished.connect(_on_music_finished)
add_child(_music_player)
_music_player.play()
play_btn.pressed.connect(_on_play)
settings_btn.pressed.connect(_on_settings)
quit_btn.pressed.connect(_on_quit)
back_btn.pressed.connect(_on_back)
_setup_resolution_options()
_setup_window_mode_options()
_setup_vsync()
_setup_msaa()
func _setup_resolution_options():
resolution_option.clear()
var current_size = DisplayServer.window_get_size()
var selected = 0
for i in range(RESOLUTIONS.size()):
var res = RESOLUTIONS[i]
resolution_option.add_item(str(res.x) + " x " + str(res.y), i)
if res == current_size:
selected = i
resolution_option.selected = selected
resolution_option.item_selected.connect(_on_resolution_changed)
func _setup_window_mode_options():
window_mode_option.clear()
window_mode_option.add_item("Fenster", 0)
window_mode_option.add_item("Randloses Fenster", 1)
window_mode_option.add_item("Vollbild", 2)
var current_mode = DisplayServer.window_get_mode()
match current_mode:
DisplayServer.WINDOW_MODE_WINDOWED:
window_mode_option.selected = 0
DisplayServer.WINDOW_MODE_FULLSCREEN:
window_mode_option.selected = 2
_:
window_mode_option.selected = 0
window_mode_option.item_selected.connect(_on_window_mode_changed)
func _setup_vsync():
var vsync_mode = DisplayServer.window_get_vsync_mode()
vsync_check.button_pressed = (vsync_mode != DisplayServer.VSYNC_DISABLED)
vsync_check.toggled.connect(_on_vsync_toggled)
func _setup_msaa():
msaa_option.clear()
msaa_option.add_item("Aus", 0)
msaa_option.add_item("2x", 1)
msaa_option.add_item("4x", 2)
msaa_option.add_item("8x", 3)
var current_msaa = get_viewport().msaa_3d
match current_msaa:
Viewport.MSAA_DISABLED:
msaa_option.selected = 0
Viewport.MSAA_2X:
msaa_option.selected = 1
Viewport.MSAA_4X:
msaa_option.selected = 2
Viewport.MSAA_8X:
msaa_option.selected = 3
msaa_option.item_selected.connect(_on_msaa_changed)
func _on_resolution_changed(index: int):
var res = RESOLUTIONS[index]
DisplayServer.window_set_size(res)
# Fenster zentrieren
var screen_size = DisplayServer.screen_get_size()
var window_pos = (screen_size - res) / 2
DisplayServer.window_set_position(window_pos)
func _on_window_mode_changed(index: int):
match index:
0: # Fenster
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_BORDERLESS, false)
1: # Randloses Fenster
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_BORDERLESS, true)
var screen_size = DisplayServer.screen_get_size()
DisplayServer.window_set_size(screen_size)
DisplayServer.window_set_position(Vector2i.ZERO)
2: # Vollbild
DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_BORDERLESS, false)
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
func _on_vsync_toggled(enabled: bool):
if enabled:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
else:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
func _on_msaa_changed(index: int):
match index:
0:
get_viewport().msaa_3d = Viewport.MSAA_DISABLED
1:
get_viewport().msaa_3d = Viewport.MSAA_2X
2:
get_viewport().msaa_3d = Viewport.MSAA_4X
3:
get_viewport().msaa_3d = Viewport.MSAA_8X
func _on_music_finished():
if _music_player:
_music_player.play()
func _on_play():
# Musik-Player an Parent übergeben damit er weiterspielt
if _music_player:
remove_child(_music_player)
get_parent().add_child(_music_player)
start_game.emit()
get_tree().paused = false
queue_free()
func _on_settings():
main_panel.visible = false
settings_panel.visible = true
func _on_back():
settings_panel.visible = false
main_panel.visible = true
func _on_quit():
get_tree().quit()