112 lines
2.5 KiB
GDScript
112 lines
2.5 KiB
GDScript
class_name PauseMenu
|
|
extends CanvasLayer
|
|
|
|
## PauseMenu - In-game pause/escape menu
|
|
|
|
signal resume_game
|
|
signal restart_game
|
|
signal return_to_menu
|
|
|
|
# UI Components
|
|
var panel: PanelContainer
|
|
var resume_button: Button
|
|
var restart_button: Button
|
|
var menu_button: Button
|
|
|
|
var menu_is_visible: bool = false
|
|
|
|
func _ready() -> void:
|
|
_create_menu()
|
|
hide_menu()
|
|
|
|
func _create_menu() -> void:
|
|
# Semi-transparent background
|
|
var bg = ColorRect.new()
|
|
add_child(bg)
|
|
bg.set_anchors_preset(Control.PRESET_FULL_RECT)
|
|
bg.color = Color(0, 0, 0, 0.7)
|
|
bg.mouse_filter = Control.MOUSE_FILTER_STOP
|
|
|
|
# Center container
|
|
var center = CenterContainer.new()
|
|
add_child(center)
|
|
center.set_anchors_preset(Control.PRESET_FULL_RECT)
|
|
|
|
# Panel
|
|
panel = PanelContainer.new()
|
|
center.add_child(panel)
|
|
|
|
var style = StyleBoxFlat.new()
|
|
style.bg_color = Color(0.15, 0.15, 0.2)
|
|
style.border_color = Color(0.3, 0.3, 0.4)
|
|
style.set_border_width_all(2)
|
|
style.set_corner_radius_all(10)
|
|
style.set_content_margin_all(30)
|
|
panel.add_theme_stylebox_override("panel", style)
|
|
|
|
var vbox = VBoxContainer.new()
|
|
panel.add_child(vbox)
|
|
vbox.add_theme_constant_override("separation", 15)
|
|
|
|
# Title
|
|
var title = Label.new()
|
|
title.text = "Game Paused"
|
|
title.add_theme_font_size_override("font_size", 28)
|
|
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
vbox.add_child(title)
|
|
|
|
# Spacer
|
|
var spacer = Control.new()
|
|
spacer.custom_minimum_size = Vector2(0, 10)
|
|
vbox.add_child(spacer)
|
|
|
|
# Resume button
|
|
resume_button = _create_menu_button("Resume")
|
|
vbox.add_child(resume_button)
|
|
resume_button.pressed.connect(_on_resume_pressed)
|
|
|
|
# Restart button
|
|
restart_button = _create_menu_button("Restart Game")
|
|
vbox.add_child(restart_button)
|
|
restart_button.pressed.connect(_on_restart_pressed)
|
|
|
|
# Return to menu button
|
|
menu_button = _create_menu_button("Main Menu")
|
|
vbox.add_child(menu_button)
|
|
menu_button.pressed.connect(_on_menu_pressed)
|
|
|
|
func _create_menu_button(text: String) -> Button:
|
|
var button = Button.new()
|
|
button.text = text
|
|
button.custom_minimum_size = Vector2(180, 45)
|
|
button.add_theme_font_size_override("font_size", 18)
|
|
return button
|
|
|
|
func show_menu() -> void:
|
|
visible = true
|
|
menu_is_visible = true
|
|
get_tree().paused = true
|
|
|
|
func hide_menu() -> void:
|
|
visible = false
|
|
menu_is_visible = false
|
|
get_tree().paused = false
|
|
|
|
func toggle_menu() -> void:
|
|
if menu_is_visible:
|
|
hide_menu()
|
|
else:
|
|
show_menu()
|
|
|
|
func _on_resume_pressed() -> void:
|
|
hide_menu()
|
|
resume_game.emit()
|
|
|
|
func _on_restart_pressed() -> void:
|
|
hide_menu()
|
|
restart_game.emit()
|
|
|
|
func _on_menu_pressed() -> void:
|
|
hide_menu()
|
|
return_to_menu.emit()
|