feat: basic main menu to load dust 2 on singleplayer

This commit is contained in:
DottsGit
2026-06-06 12:55:17 -04:00
parent 83c6ce7993
commit 2baf27efd1
4 changed files with 180 additions and 1 deletions
+166
View File
@@ -0,0 +1,166 @@
extends Control
func _ready() -> void:
# ==========================================
# BACKGROUND: 3D DIORAMA (Sliding Player)
# ==========================================
var right_panel = SubViewportContainer.new()
right_panel.set_anchors_preset(Control.PRESET_FULL_RECT)
right_panel.stretch = true
right_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE
add_child(right_panel)
var viewport = SubViewport.new()
viewport.own_world_3d = true
right_panel.add_child(viewport)
_build_3d_diorama(viewport)
# ==========================================
# FOREGROUND: UI (Title and Buttons)
# ==========================================
var ui_vbox = VBoxContainer.new()
ui_vbox.add_theme_constant_override("separation", 30)
ui_vbox.set_anchor_and_offset(SIDE_LEFT, 0.0, 50)
ui_vbox.set_anchor_and_offset(SIDE_TOP, 0.0, 50)
ui_vbox.set_anchor_and_offset(SIDE_RIGHT, 0.0, 600)
ui_vbox.set_anchor_and_offset(SIDE_BOTTOM, 1.0, -50)
add_child(ui_vbox)
# Title
var title = Label.new()
title.text = "Papaya Shooter"
title.add_theme_font_size_override("font_size", 72)
title.add_theme_color_override("font_color", Color(1, 0.6, 0.2)) # Papaya orange
title.add_theme_color_override("font_outline_color", Color(0, 0, 0))
title.add_theme_constant_override("outline_size", 12)
ui_vbox.add_child(title)
# Spacer
var spacer = Control.new()
spacer.custom_minimum_size = Vector2(0, 40)
ui_vbox.add_child(spacer)
# Buttons
_add_button(ui_vbox, "Singleplayer", _on_singleplayer_pressed)
_add_button(ui_vbox, "Multiplayer", _on_multiplayer_pressed)
_add_button(ui_vbox, "Settings", _on_settings_pressed)
_add_button(ui_vbox, "Exit Game", _on_exit_pressed)
func _add_button(parent: VBoxContainer, text: String, callback: Callable) -> void:
var btn = Button.new()
btn.text = text
btn.add_theme_font_size_override("font_size", 32)
btn.custom_minimum_size = Vector2(300, 60)
btn.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN
btn.pressed.connect(callback)
parent.add_child(btn)
func _on_singleplayer_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/dust2_level/dust2_level.tscn")
func _on_multiplayer_pressed() -> void:
print("Multiplayer not implemented yet.")
func _on_settings_pressed() -> void:
print("Settings not implemented yet.")
func _on_exit_pressed() -> void:
get_tree().quit()
# ==========================================
# 3D DIORAMA BUILDER
# ==========================================
func _build_3d_diorama(viewport: SubViewport) -> void:
var world = Node3D.new()
viewport.add_child(world)
# Lighting and Env
var env = WorldEnvironment.new()
var environment = Environment.new()
environment.background_mode = Environment.BG_COLOR
environment.background_color = Color(0.1, 0.15, 0.2) # Dark stylish background
environment.tonemap_mode = Environment.TONE_MAPPER_ACES
env.environment = environment
world.add_child(env)
var sun = DirectionalLight3D.new()
sun.rotation_degrees = Vector3(-45, 45, 0)
sun.light_color = Color(1.0, 0.9, 0.8)
sun.light_energy = 1.5
sun.shadow_enabled = true
world.add_child(sun)
var fill = DirectionalLight3D.new()
fill.rotation_degrees = Vector3(-30, -135, 0)
fill.light_color = Color(0.5, 0.6, 1.0)
fill.light_energy = 0.5
world.add_child(fill)
# Floor
var floor_mesh = MeshInstance3D.new()
floor_mesh.mesh = PlaneMesh.new()
floor_mesh.mesh.size = Vector2(20, 20)
var floor_mat = StandardMaterial3D.new()
floor_mat.albedo_color = Color(0.2, 0.2, 0.2)
floor_mesh.mesh.surface_set_material(0, floor_mat)
world.add_child(floor_mesh)
# Player Model (Sliding Pose)
var player_model = Node3D.new()
player_model.position = Vector3(0, 0.5, 0) # Lowered for slide
world.add_child(player_model)
var body_mat = StandardMaterial3D.new()
body_mat.albedo_color = Color(0.3, 0.6, 0.9)
# Torso (Capsule tilted back)
var torso = MeshInstance3D.new()
var t_mesh = CapsuleMesh.new()
t_mesh.radius = 0.4
t_mesh.height = 1.2
t_mesh.material = body_mat
torso.mesh = t_mesh
torso.rotation_degrees.x = -60 # Tilted back
torso.position = Vector3(0, 0.4, 0)
player_model.add_child(torso)
# Legs (Sticking forward)
var legs = MeshInstance3D.new()
var l_mesh = BoxMesh.new()
l_mesh.size = Vector3(0.6, 0.4, 1.2)
l_mesh.material = body_mat
legs.mesh = l_mesh
legs.position = Vector3(0, -0.2, 0.6)
player_model.add_child(legs)
# Arm holding shotgun
var arm = Node3D.new()
arm.position = Vector3(0.5, 0.6, 0.2)
player_model.add_child(arm)
var arm_mesh = MeshInstance3D.new()
var a_mesh = BoxMesh.new()
a_mesh.size = Vector3(0.2, 0.2, 0.8)
a_mesh.material = body_mat
arm_mesh.mesh = a_mesh
arm_mesh.position = Vector3(0, 0, 0.3)
arm.add_child(arm_mesh)
# Shotgun
var shotgun_script = load("res://weapons/double_barrel_shotgun.gd")
if shotgun_script:
var shotgun = shotgun_script.new()
arm_mesh.add_child(shotgun)
shotgun.position = Vector3(0, -0.1, 0.4)
shotgun.rotation_degrees = Vector3(0, 0, 0)
shotgun.set_process(false)
shotgun.set_physics_process(false)
if shotgun.has_method("set_process_input"):
shotgun.set_process_input(false)
# Camera
var camera = Camera3D.new()
world.add_child(camera)
camera.position = Vector3(3, 1.5, 4)
camera.look_at(Vector3(0, 0.5, 0))