diff --git a/project.godot b/project.godot index 5fdae15..c227471 100644 --- a/project.godot +++ b/project.godot @@ -11,6 +11,7 @@ config_version=5 [application] config/name="BaseDefendPrototype" +run/main_scene="res://scenes/main.tscn" config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://icon.svg" @@ -22,3 +23,36 @@ gdscript/warnings/untyped_declaration=2 version_control/plugin_name="GitPlugin" version_control/autoload_on_startup=true + +[input] + +scroll_up={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +scroll_down={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) +] +} +right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) +] +} +forward={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) +] +} +back={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null) +] +} diff --git a/scenes/Camera3D.gd b/scenes/Camera3D.gd new file mode 100644 index 0000000..4eb161d --- /dev/null +++ b/scenes/Camera3D.gd @@ -0,0 +1,27 @@ +extends Camera3D + +@onready var raycast : RayCast3D = $RayCast3D +var last_collided_object : CollisionObject3D = null + +func _process(_delta : float) -> void: + check_interaction() + +func check_interaction() -> void: + if raycast.is_colliding(): + var collider : CollisionObject3D = raycast.get_collider() + if collider != last_collided_object: + if last_collided_object != null: + print("Stopped looking at interactable object:", last_collided_object.name) + if last_collided_object.has_method("make_interactable"): + last_collided_object.make_interactable(false) + print("Started looking at interactable object:", collider.name) + last_collided_object = collider + if collider.has_method("make_interactable"): + collider.make_interactable(true) + + else: + if last_collided_object != null: + print("Stopped looking at interactable object:", last_collided_object.name) + if last_collided_object.has_method("make_interactable"): + last_collided_object.make_interactable(false) + last_collided_object = null diff --git a/scenes/control_panel.tscn b/scenes/control_panel.tscn new file mode 100644 index 0000000..19e177f --- /dev/null +++ b/scenes/control_panel.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=11 format=3 uid="uid://bte0jkgh6vd8x"] + +[ext_resource type="Script" path="res://scripts/Slider1.gd" id="1_nyunj"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_6i38b"] +size = Vector3(3, 1, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4f8ex"] +albedo_color = Color(0.351563, 0.351563, 0.351563, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_ymgdf"] +material = SubResource("StandardMaterial3D_4f8ex") +size = Vector3(3, 1, 0.3) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_em8o8"] +albedo_color = Color(0.351563, 0.351563, 0.351563, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_7rk03"] +material = SubResource("StandardMaterial3D_em8o8") +size = Vector3(3, 0.1, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_gw828"] +size = Vector3(0.1, 0.05, 0.6) + +[sub_resource type="BoxMesh" id="BoxMesh_5801d"] +size = Vector3(0.05, 0.05, 0.5) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ldgvd"] +albedo_color = Color(0.0438094, 0.444896, 0.673899, 1) + +[sub_resource type="CylinderMesh" id="CylinderMesh_s3lht"] +material = SubResource("StandardMaterial3D_ldgvd") +top_radius = 0.02 +bottom_radius = 0.02 +height = 0.1 + +[node name="ControlPanel" type="StaticBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.5, 0.5) +shape = SubResource("BoxShape3D_6i38b") + +[node name="Structure" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0.5, 0.5) +mesh = SubResource("BoxMesh_ymgdf") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Structure"] +transform = Transform3D(1, 0, 0, 0, 0.939693, -0.34202, 0, 0.34202, 0.939693, 0, 0.55, 0) +mesh = SubResource("BoxMesh_7rk03") + +[node name="Slider1" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.939693, -0.34202, 0, 0.34202, 0.939693, 0.182479, 1.06904, 0.591278) +script = ExtResource("1_nyunj") + +[node name="RaycastCollider" type="CollisionShape3D" parent="Slider1"] +shape = SubResource("BoxShape3D_gw828") + +[node name="Slider" type="MeshInstance3D" parent="Slider1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +mesh = SubResource("BoxMesh_5801d") + +[node name="Knob" type="MeshInstance3D" parent="Slider1/Slider"] +transform = Transform3D(-4.37115e-08, 1, -4.37115e-08, 0, -4.37114e-08, -1, -1, -4.37114e-08, 1.91069e-15, 0, 0.04, 0.25) +mesh = SubResource("CylinderMesh_s3lht") diff --git a/scenes/main.gd b/scenes/main.gd new file mode 100644 index 0000000..08f4a43 --- /dev/null +++ b/scenes/main.gd @@ -0,0 +1,4 @@ +extends Node3D + +func _ready() -> void: + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED diff --git a/scenes/main.tscn b/scenes/main.tscn new file mode 100644 index 0000000..fd25171 --- /dev/null +++ b/scenes/main.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=6 format=3 uid="uid://dlekwle45c0y2"] + +[ext_resource type="Script" path="res://scenes/main.gd" id="1_12te6"] +[ext_resource type="PackedScene" uid="uid://bte0jkgh6vd8x" path="res://scenes/control_panel.tscn" id="1_j1pw0"] +[ext_resource type="PackedScene" uid="uid://u6bx2c081h3n" path="res://scenes/player.tscn" id="2_04ebg"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_3nuje"] +size = Vector3(50, 2, 50) + +[sub_resource type="BoxMesh" id="BoxMesh_py2d4"] +size = Vector3(50, 2, 50) + +[node name="Main" type="Node3D"] +script = ExtResource("1_12te6") + +[node name="ControlPanel" parent="." instance=ExtResource("1_j1pw0")] + +[node name="SpotLight3D" type="SpotLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.568088, 0.822968, 0, -0.822968, 0.568088, 1.3562, 2.47603, 2.06382) +light_energy = 16.0 + +[node name="Player" parent="." instance=ExtResource("2_04ebg")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.26895, 1.48304, 1.97319) + +[node name="Ground" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"] +shape = SubResource("BoxShape3D_3nuje") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground/CollisionShape3D"] +mesh = SubResource("BoxMesh_py2d4") diff --git a/scenes/player.tscn b/scenes/player.tscn new file mode 100644 index 0000000..60b8ff9 --- /dev/null +++ b/scenes/player.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=4 format=3 uid="uid://u6bx2c081h3n"] + +[ext_resource type="Script" path="res://scripts/Player.gd" id="1_s6pnw"] +[ext_resource type="Script" path="res://scenes/Camera3D.gd" id="2_vvm4p"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vhrs0"] +radius = 0.2 + +[node name="Player" type="CharacterBody3D"] +script = ExtResource("1_s6pnw") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_vhrs0") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.673565, 0) +script = ExtResource("2_vvm4p") + +[node name="RayCast3D" type="RayCast3D" parent="Camera3D"] +target_position = Vector3(0, 0, -3) + +[node name="PlayerUI" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ColorRect" type="ColorRect" parent="PlayerUI"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -0.5 +offset_top = -0.5 +offset_right = 1.5 +offset_bottom = 1.5 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/scripts/Player.gd b/scripts/Player.gd new file mode 100644 index 0000000..d4e360e --- /dev/null +++ b/scripts/Player.gd @@ -0,0 +1,22 @@ +extends CharacterBody3D + +var gravity : float = ProjectSettings.get_setting("physics/3d/default_gravity") +var speed : float = 5.0 +var mouse_sensitivity : float = 0.002 +@onready var camera_3d : Camera3D = $Camera3D + +func _physics_process(delta : float) -> void: + if not is_on_floor(): + velocity.y += -gravity * delta + var input : Vector2 = Input.get_vector("left", "right", "forward", "back") + var movement_dir : Vector3 = transform.basis * Vector3(input.x, 0, input.y) + velocity.x = movement_dir.x * speed + velocity.z = movement_dir.z * speed + + move_and_slide() + +func _input(event : InputEvent) -> void: + if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: + rotate_y(-event.relative.x * mouse_sensitivity) + camera_3d.rotate_x(-event.relative.y * mouse_sensitivity) + camera_3d.rotation.x = clampf(camera_3d.rotation.x, -deg_to_rad(70), deg_to_rad(70)) diff --git a/scripts/Slider1.gd b/scripts/Slider1.gd new file mode 100644 index 0000000..a6ecf92 --- /dev/null +++ b/scripts/Slider1.gd @@ -0,0 +1,35 @@ +extends StaticBody3D + + +@export var slider_length: float = 0.5 +@export var angle_degrees: float = 20.0 +@export var scroll_sensitivity: float = 0.025 +@onready var knob : MeshInstance3D = $Slider/Knob + +var knob_position : float = 0.0 +var interacting : bool = false + +func _ready() -> void: + print("ready!") + update_knob_position() + +func _process(_delta : float) -> void: + if interacting: + if Input.is_action_just_pressed("scroll_up"): + knob_position = clamp(knob_position + scroll_sensitivity, 0.0, 1.0) + update_knob_position() + elif Input.is_action_just_pressed("scroll_down"): + knob_position = clamp(knob_position - scroll_sensitivity, 0.0, 1.0) + update_knob_position() + +func update_knob_position() -> void: + var start_position : Vector3 = Vector3(0, 0.04, slider_length / 2) + var end_position : Vector3 = Vector3(0, 0.04, -slider_length / 2) + + var knob_world_position : Vector3 = start_position.lerp(end_position, knob_position) + knob.position = knob_world_position + print(knob_position) + print(knob_world_position) + +func make_interactable(interactable : bool) -> void: + interacting = interactable