start creating the framework for menus (#3)
all very experimental so it'll see lots of changes
This commit is contained in:
parent
f7e85724b3
commit
eefda9e2bd
6 changed files with 479 additions and 1 deletions
110
menus/main/area.tscn
Normal file
110
menus/main/area.tscn
Normal file
|
@ -0,0 +1,110 @@
|
|||
[gd_scene load_steps=7 format=3 uid="uid://ikeidrgprk8k"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://wlhsarkeqe8r" path="res://menus/main/panel.tscn" id="1_qfa5o"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_bt14i"]
|
||||
script/source = "extends Node3D
|
||||
|
||||
var start_menu = preload(\"res://menus/main/start_menu.tscn\")
|
||||
var save_file_manager = preload(\"res://menus/main/save_file_manager.tscn\")
|
||||
|
||||
func _ready() -> void:
|
||||
var sm = start_menu.instantiate()
|
||||
sm.connect(\"request_start\", start)
|
||||
sm.connect(\"request_settings\", settings)
|
||||
$Menus/Panel1.change_menu(sm)
|
||||
|
||||
func start() -> void:
|
||||
var svm = save_file_manager.instantiate()
|
||||
$Menus/Panel2.change_menu(svm)
|
||||
rotate_cube(90)
|
||||
|
||||
func settings() -> void:
|
||||
rotate_cube(90)
|
||||
|
||||
func rotate_cube(degrees: int) -> void:
|
||||
if $Menus/AnimationPlayer.is_playing():
|
||||
return
|
||||
degrees = -degrees
|
||||
|
||||
var animation: Animation = $Menus/AnimationPlayer.get_animation(\"rotate\")
|
||||
var new_rotation = $Menus.rotation_degrees + Vector3(0, degrees, 0)
|
||||
animation.track_set_key_value(0, 0, $Menus.rotation_degrees)
|
||||
animation.track_set_key_value(0, 1, new_rotation)
|
||||
|
||||
$Menus/AnimationPlayer.play(\"rotate\")
|
||||
"
|
||||
|
||||
[sub_resource type="Animation" id="Animation_0jxef"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:rotation_degrees")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Vector3(0, 0, 0)]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_bt14i"]
|
||||
resource_name = "rotate"
|
||||
length = 0.3
|
||||
step = 0.3
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:rotation_degrees")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.3),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Vector3(0, 0, 0), Vector3(0, 0, 0)]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_3bwb0"]
|
||||
_data = {
|
||||
&"RESET": SubResource("Animation_0jxef"),
|
||||
&"rotate": SubResource("Animation_bt14i")
|
||||
}
|
||||
|
||||
[sub_resource type="Environment" id="Environment_qfa5o"]
|
||||
background_mode = 1
|
||||
background_color = Color(0.804743, 0.804743, 0.804743, 1)
|
||||
|
||||
[node name="Area" type="Node3D"]
|
||||
process_mode = 3
|
||||
script = SubResource("GDScript_bt14i")
|
||||
|
||||
[node name="SpotLight3D" type="SpotLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1.90692, 0)
|
||||
|
||||
[node name="Menus" type="CSGBox3D" parent="."]
|
||||
|
||||
[node name="Panel1" parent="Menus" instance=ExtResource("1_qfa5o")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.501)
|
||||
|
||||
[node name="Panel2" parent="Menus" instance=ExtResource("1_qfa5o")]
|
||||
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.501, 0, 0)
|
||||
|
||||
[node name="Panel3" parent="Menus" instance=ExtResource("1_qfa5o")]
|
||||
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -0.501)
|
||||
|
||||
[node name="Panel4" parent="Menus" instance=ExtResource("1_qfa5o")]
|
||||
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -0.501, 0, 0)
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="Menus"]
|
||||
libraries = {
|
||||
&"": SubResource("AnimationLibrary_3bwb0")
|
||||
}
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="."]
|
||||
transform = Transform3D(0.975535, 0, 0.219846, 0, 1, 0, -0.219846, 0, 0.975535, 0.86618, 0.217345, 1.76032)
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_qfa5o")
|
113
menus/main/panel.tscn
Normal file
113
menus/main/panel.tscn
Normal file
|
@ -0,0 +1,113 @@
|
|||
[gd_scene load_steps=7 format=3 uid="uid://wlhsarkeqe8r"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://tasbgr10p84c" path="res://menus/menu.tscn" id="1_3roig"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_gfsnp"]
|
||||
script/source = "# this whole code is from \"GUI in 3D\"
|
||||
# which is something I downloaded a long time ago so no link
|
||||
|
||||
extends Node3D
|
||||
|
||||
var is_mouse_inside := false
|
||||
var last_event_pos2D := Vector2()
|
||||
var last_event_time := -1.0
|
||||
|
||||
@onready var node_viewport: SubViewport = $SubViewport
|
||||
@onready var node_quad: MeshInstance3D = $MeshInstance3D
|
||||
@onready var node_area: Area3D = $MeshInstance3D/Area3D
|
||||
|
||||
func _ready() -> void:
|
||||
node_area.mouse_entered.connect(_mouse_entered_area)
|
||||
node_area.mouse_exited.connect(_mouse_exited_area)
|
||||
node_area.input_event.connect(_mouse_input_event)
|
||||
|
||||
func _mouse_entered_area() -> void:
|
||||
is_mouse_inside = true
|
||||
|
||||
func _mouse_exited_area() -> void:
|
||||
is_mouse_inside = false
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
for mouse_event in [InputEventMouseButton, InputEventMouseMotion, InputEventScreenDrag, InputEventScreenTouch]:
|
||||
if is_instance_of(event, mouse_event):
|
||||
return
|
||||
node_viewport.push_input(event)
|
||||
|
||||
func _mouse_input_event(_camera: Camera3D, event: InputEvent, event_position: Vector3, _normal: Vector3, _shape_idx: int) -> void:
|
||||
var quad_mesh_size: Vector2 = node_quad.mesh.size
|
||||
var now := Time.get_ticks_msec() / 1000.0
|
||||
|
||||
var event_pos3D := event_position
|
||||
event_pos3D = node_quad.global_transform.affine_inverse() * event_pos3D
|
||||
|
||||
var event_pos2D := Vector2()
|
||||
if is_mouse_inside:
|
||||
event_pos2D = Vector2(event_pos3D.x, -event_pos3D.y)
|
||||
|
||||
event_pos2D.x = event_pos2D.x / quad_mesh_size.x
|
||||
event_pos2D.y = event_pos2D.y / quad_mesh_size.y
|
||||
|
||||
event_pos2D.x += 0.5
|
||||
event_pos2D.y += 0.5
|
||||
|
||||
event_pos2D.x *= node_viewport.size.x
|
||||
event_pos2D.y *= node_viewport.size.y
|
||||
|
||||
elif last_event_pos2D != null:
|
||||
event_pos2D = last_event_pos2D
|
||||
|
||||
event.position = event_pos2D
|
||||
if event is InputEventMouse:
|
||||
event.global_position = event_pos2D
|
||||
|
||||
if event is InputEventMouseMotion or event is InputEventScreenDrag:
|
||||
if last_event_pos2D == null:
|
||||
event.relative = Vector2(0, 0)
|
||||
else:
|
||||
event.relative = event_pos2D - last_event_pos2D
|
||||
event.velocity = event.relative / (now - last_event_time)
|
||||
|
||||
last_event_pos2D = event_pos2D
|
||||
last_event_time = now
|
||||
node_viewport.push_input(event)
|
||||
|
||||
# original code
|
||||
|
||||
func change_menu(new_menu: Control):
|
||||
$SubViewport/Menu.add(new_menu)
|
||||
"
|
||||
|
||||
[sub_resource type="QuadMesh" id="QuadMesh_gfsnp"]
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_gfsnp"]
|
||||
viewport_path = NodePath("SubViewport")
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_a5lkq"]
|
||||
resource_local_to_scene = true
|
||||
transparency = 1
|
||||
shading_mode = 0
|
||||
albedo_texture = SubResource("ViewportTexture_gfsnp")
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_gfsnp"]
|
||||
size = Vector3(1, 1, 0.01)
|
||||
|
||||
[node name="Panel" type="Node3D"]
|
||||
process_mode = 3
|
||||
script = SubResource("GDScript_gfsnp")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
||||
mesh = SubResource("QuadMesh_gfsnp")
|
||||
surface_material_override/0 = SubResource("StandardMaterial3D_a5lkq")
|
||||
|
||||
[node name="Area3D" type="Area3D" parent="MeshInstance3D"]
|
||||
collision_layer = 2
|
||||
input_capture_on_drag = true
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/Area3D"]
|
||||
shape = SubResource("BoxShape3D_gfsnp")
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="."]
|
||||
gui_embed_subwindows = true
|
||||
render_target_update_mode = 4
|
||||
|
||||
[node name="Menu" parent="SubViewport" instance=ExtResource("1_3roig")]
|
102
menus/main/save_file_manager.tscn
Normal file
102
menus/main/save_file_manager.tscn
Normal file
|
@ -0,0 +1,102 @@
|
|||
[gd_scene load_steps=5 format=3 uid="uid://w5te3qujco7d"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_a5kgg"]
|
||||
script/source = "extends MarginContainer
|
||||
|
||||
func _ready() -> void:
|
||||
$HSplitContainer/CenterContainer/Label.hide()
|
||||
|
||||
|
||||
func _on_button_pressed() -> void:
|
||||
$HSplitContainer/CenterContainer/Label.show()
|
||||
$AnimationPlayer.play(\"add_information\")
|
||||
"
|
||||
|
||||
[sub_resource type="Animation" id="Animation_a5kgg"]
|
||||
resource_name = "add_information"
|
||||
length = 0.2
|
||||
step = 0.2
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("HSplitContainer/CenterContainer:size_flags_stretch_ratio")
|
||||
tracks/0/interp = 2
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.2),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [0.0, 2.0]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_xs01b"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("HSplitContainer/CenterContainer:size_flags_stretch_ratio")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [0.0]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_36lt1"]
|
||||
_data = {
|
||||
&"RESET": SubResource("Animation_xs01b"),
|
||||
&"add_information": SubResource("Animation_a5kgg")
|
||||
}
|
||||
|
||||
[node name="SaveFileManager" type="MarginContainer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
theme_override_constants/margin_left = 20
|
||||
theme_override_constants/margin_top = 20
|
||||
theme_override_constants/margin_right = 20
|
||||
theme_override_constants/margin_bottom = 20
|
||||
script = SubResource("GDScript_a5kgg")
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="."]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
alignment = 1
|
||||
|
||||
[node name="Button" type="Button" parent="HSplitContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Save file"
|
||||
|
||||
[node name="Button2" type="Button" parent="HSplitContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Save file"
|
||||
|
||||
[node name="Button3" type="Button" parent="HSplitContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Save file"
|
||||
|
||||
[node name="CenterContainer" type="CenterContainer" parent="HSplitContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_stretch_ratio = 0.0
|
||||
|
||||
[node name="Label" type="Label" parent="HSplitContainer/CenterContainer"]
|
||||
show_behind_parent = true
|
||||
layout_mode = 2
|
||||
text = "Information"
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||
libraries = {
|
||||
&"": SubResource("AnimationLibrary_36lt1")
|
||||
}
|
||||
|
||||
[connection signal="pressed" from="HSplitContainer/VBoxContainer/Button" to="." method="_on_button_pressed"]
|
54
menus/main/start_menu.tscn
Normal file
54
menus/main/start_menu.tscn
Normal file
|
@ -0,0 +1,54 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://dys7qyy4b3gjt"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_vfuxb"]
|
||||
script/source = "extends Control
|
||||
|
||||
signal request_start
|
||||
signal request_settings
|
||||
|
||||
func _on_btn_start_pressed() -> void:
|
||||
request_start.emit()
|
||||
|
||||
func _on_btn_settings_pressed() -> void:
|
||||
request_settings.emit()
|
||||
|
||||
func _on_btn_exit_pressed() -> void:
|
||||
get_tree().quit()
|
||||
"
|
||||
|
||||
[node name="StartMenu" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = SubResource("GDScript_vfuxb")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 14
|
||||
anchor_top = 0.5
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.5
|
||||
offset_top = -50.5
|
||||
offset_bottom = 50.5
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="BtnStart" type="Button" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Start the game!"
|
||||
|
||||
[node name="BtnSettings" type="Button" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Check out the settings"
|
||||
|
||||
[node name="BtnExit" type="Button" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Exit the game"
|
||||
|
||||
[connection signal="pressed" from="VBoxContainer/BtnStart" to="." method="_on_btn_start_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/BtnSettings" to="." method="_on_btn_settings_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/BtnExit" to="." method="_on_btn_exit_pressed"]
|
99
menus/menu.tscn
Normal file
99
menus/menu.tscn
Normal file
|
@ -0,0 +1,99 @@
|
|||
[gd_scene load_steps=6 format=3 uid="uid://tasbgr10p84c"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_18a3y"]
|
||||
script/source = "extends MarginContainer
|
||||
|
||||
func add(node: Control):
|
||||
var add_to := $VSplitContainer/MarginContainer/ColorRect
|
||||
var children := add_to.get_children(true)
|
||||
for child in children:
|
||||
child.queue_free()
|
||||
|
||||
var regex := RegEx.new()
|
||||
regex.compile(\"([A-Z])\")
|
||||
var menu_name := regex.sub(node.name, \" $1\", true, 1)
|
||||
$VSplitContainer/Label.text = menu_name
|
||||
add_to.add_child(node)
|
||||
$VSplitContainer/AnimationPlayer.play(\"split_offset\")
|
||||
|
||||
#await get_tree().create_timer(3.0).timeout
|
||||
#$VSplitContainer/AnimationPlayer.play_backwards(\"split_offset\")
|
||||
"
|
||||
|
||||
[sub_resource type="Animation" id="Animation_y8e4h"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:split_offset")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [500]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_85u52"]
|
||||
resource_name = "split_offset"
|
||||
length = 0.5
|
||||
step = 0.5
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:split_offset")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.5),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [500, 0]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_hl3ms"]
|
||||
_data = {
|
||||
&"RESET": SubResource("Animation_y8e4h"),
|
||||
&"split_offset": SubResource("Animation_85u52")
|
||||
}
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_2d4ws"]
|
||||
font_size = 48
|
||||
|
||||
[node name="Menu" type="MarginContainer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme_override_constants/margin_left = 20
|
||||
theme_override_constants/margin_top = 20
|
||||
theme_override_constants/margin_right = 20
|
||||
theme_override_constants/margin_bottom = 20
|
||||
script = SubResource("GDScript_18a3y")
|
||||
|
||||
[node name="VSplitContainer" type="VSplitContainer" parent="."]
|
||||
layout_mode = 2
|
||||
split_offset = 500
|
||||
dragger_visibility = 1
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="VSplitContainer"]
|
||||
libraries = {
|
||||
&"": SubResource("AnimationLibrary_hl3ms")
|
||||
}
|
||||
|
||||
[node name="Label" type="Label" parent="VSplitContainer"]
|
||||
layout_mode = 2
|
||||
text = "MENU NAME"
|
||||
label_settings = SubResource("LabelSettings_2d4ws")
|
||||
horizontal_alignment = 1
|
||||
uppercase = true
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="VSplitContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_top = 20
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="VSplitContainer/MarginContainer"]
|
||||
layout_mode = 2
|
||||
color = Color(0, 0, 0, 1)
|
Loading…
Add table
Add a link
Reference in a new issue