From 3f97e18615b59db24372c2c8e30cc567d017680f0839feae995058f3cca3210f Mon Sep 17 00:00:00 2001 From: Jan Trencansky Date: Sat, 24 Jan 2026 12:34:02 -0500 Subject: [PATCH] Add player movement --- .editorconfig | 4 + .gitattributes | 2 + .gitignore | 1 + Imperfect Space.csproj | 11 ++ Imperfect Space.sln | 19 ++ README.md | 2 +- icon.svg | 1 + icon.svg.import | 43 +++++ project.godot | 76 ++++++++ scenes/game.tscn | 122 +++++++++++++ scenes/main_menu.tscn | 35 ++++ scripts/Constants.cs | 3 + scripts/Constants.cs.uid | 1 + scripts/GameMenuController.cs | 9 + scripts/GameMenuController.cs.uid | 1 + scripts/GeneralControlManager.cs | 41 +++++ scripts/GeneralControlManager.cs.uid | 1 + scripts/GravityReceiver.cs | 22 +++ scripts/GravityReceiver.cs.uid | 1 + scripts/GravityZone.cs | 16 ++ scripts/GravityZone.cs.uid | 1 + scripts/Helpers.cs | 3 + scripts/Helpers.cs.uid | 1 + scripts/MainMenu/MainMenuController.cs | 14 ++ scripts/MainMenu/MainMenuController.cs.uid | 1 + scripts/Player.cs | 200 +++++++++++++++++++++ scripts/Player.cs.uid | 1 + 27 files changed, 631 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 Imperfect Space.csproj create mode 100644 Imperfect Space.sln create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 scenes/game.tscn create mode 100644 scenes/main_menu.tscn create mode 100644 scripts/Constants.cs create mode 100644 scripts/Constants.cs.uid create mode 100644 scripts/GameMenuController.cs create mode 100644 scripts/GameMenuController.cs.uid create mode 100644 scripts/GeneralControlManager.cs create mode 100644 scripts/GeneralControlManager.cs.uid create mode 100644 scripts/GravityReceiver.cs create mode 100644 scripts/GravityReceiver.cs.uid create mode 100644 scripts/GravityZone.cs create mode 100644 scripts/GravityZone.cs.uid create mode 100644 scripts/Helpers.cs create mode 100644 scripts/Helpers.cs.uid create mode 100644 scripts/MainMenu/MainMenuController.cs create mode 100644 scripts/MainMenu/MainMenuController.cs.uid create mode 100644 scripts/Player.cs create mode 100644 scripts/Player.cs.uid diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1617678 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..83264fb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore index 4dbc812..79d5dce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # ---> Godot # Godot 4+ specific ignores .godot/ +/android/ # Godot-specific ignores .import/ diff --git a/Imperfect Space.csproj b/Imperfect Space.csproj new file mode 100644 index 0000000..d7ef75c --- /dev/null +++ b/Imperfect Space.csproj @@ -0,0 +1,11 @@ + + + net8.0 + net9.0 + true + ImperfectSpace + true + + diff --git a/Imperfect Space.sln b/Imperfect Space.sln new file mode 100644 index 0000000..b32fe55 --- /dev/null +++ b/Imperfect Space.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Imperfect Space", "Imperfect Space.csproj", "{93B3F7D2-13DE-425C-89B4-C80E0B48EAB7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + ExportDebug|Any CPU = ExportDebug|Any CPU + ExportRelease|Any CPU = ExportRelease|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {93B3F7D2-13DE-425C-89B4-C80E0B48EAB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93B3F7D2-13DE-425C-89B4-C80E0B48EAB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93B3F7D2-13DE-425C-89B4-C80E0B48EAB7}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU + {93B3F7D2-13DE-425C-89B4-C80E0B48EAB7}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU + {93B3F7D2-13DE-425C-89B4-C80E0B48EAB7}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU + {93B3F7D2-13DE-425C-89B4-C80E0B48EAB7}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md index ee42f15..22eb597 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # imperfect-space -Space RPG Simulation Game \ No newline at end of file +Space RPG Simulation Game diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..1345199 --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..01cc6c0 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1qrx53nygt1v" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..19b0a67 --- /dev/null +++ b/project.godot @@ -0,0 +1,76 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Imperfect Space" +run/main_scene="uid://bnmh1mebldx4l" +config/features=PackedStringArray("4.6", "C#", "Forward Plus") +config/icon="res://icon.svg" + +[dotnet] + +project/assembly_name="Imperfect Space" + +[input] + +jump={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +move_left={ +"deadzone": 0.2, +"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,"location":0,"echo":false,"script":null) +] +} +move_right={ +"deadzone": 0.2, +"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,"location":0,"echo":false,"script":null) +] +} +move_forward={ +"deadzone": 0.2, +"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,"location":0,"echo":false,"script":null) +] +} +move_back={ +"deadzone": 0.2, +"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,"location":0,"echo":false,"script":null) +] +} +move_up={ +"deadzone": 0.2, +"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":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} +move_down={ +"deadzone": 0.2, +"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":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +rotate_left={ +"deadzone": 0.2, +"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":81,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null) +] +} +rotate_right={ +"deadzone": 0.2, +"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":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) +] +} + +[physics] + +3d/physics_engine="Jolt Physics" + +[rendering] + +rendering_device/driver.windows="d3d12" diff --git a/scenes/game.tscn b/scenes/game.tscn new file mode 100644 index 0000000..b47df55 --- /dev/null +++ b/scenes/game.tscn @@ -0,0 +1,122 @@ +[gd_scene format=3 uid="uid://b3yh6h7fdt160"] + +[ext_resource type="Script" uid="uid://cue3c56axvyja" path="res://scripts/Player.cs" id="1_uwrxv"] +[ext_resource type="Script" uid="uid://cy8nuarxbnd" path="res://scripts/GravityZone.cs" id="1_yqjtg"] +[ext_resource type="Script" uid="uid://bwpdtkgmwjs7g" path="res://scripts/GravityReceiver.cs" id="3_lnu2h"] +[ext_resource type="Script" uid="uid://n557xfrv0i6x" path="res://scripts/GeneralControlManager.cs" id="4_lbhrr"] +[ext_resource type="Script" uid="uid://betypbypf6bf2" path="res://scripts/GameMenuController.cs" id="5_iywne"] + +[sub_resource type="PlaneMesh" id="PlaneMesh_8cj0n"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_8cj0n"] +size = Vector3(10, 0.5, 10) + +[sub_resource type="BoxShape3D" id="BoxShape3D_uwrxv"] +size = Vector3(10, 5, 10) + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_8cj0n"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_uwrxv"] + +[node name="Game" type="Node3D" unique_id=1201210338] + +[node name="Plane2" type="StaticBody3D" parent="." unique_id=289682669] +transform = Transform3D(1, 0, 0, 0, 0.99999994, 0, 0, 0, 0.99999994, -20.320108, 0, 0) + +[node name="PlaneMesh" type="MeshInstance3D" parent="Plane2" unique_id=1859317875] +transform = Transform3D(5, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0) +mesh = SubResource("PlaneMesh_8cj0n") + +[node name="PlaneCollider" type="CollisionShape3D" parent="Plane2" unique_id=907638578] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.2, 0) +shape = SubResource("BoxShape3D_8cj0n") + +[node name="GravityZone" type="Area3D" parent="Plane2" unique_id=600317513] +gravity_space_override = 2 +script = ExtResource("1_yqjtg") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Plane2/GravityZone" unique_id=991265750] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 0) +shape = SubResource("BoxShape3D_uwrxv") + +[node name="Plane" type="StaticBody3D" parent="." unique_id=1260154250] +transform = Transform3D(1, 0, 0, 0, 0.70710677, 0.70710677, 0, -0.70710677, 0.70710677, 0, 0, 0) + +[node name="PlaneMesh" type="MeshInstance3D" parent="Plane" unique_id=107049489] +transform = Transform3D(5, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0) +mesh = SubResource("PlaneMesh_8cj0n") + +[node name="PlaneCollider" type="CollisionShape3D" parent="Plane" unique_id=970373853] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.2, 0) +shape = SubResource("BoxShape3D_8cj0n") + +[node name="GravityZone" type="Area3D" parent="Plane" unique_id=1326543003] +gravity_space_override = 2 +script = ExtResource("1_yqjtg") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Plane/GravityZone" unique_id=772916098] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 0) +shape = SubResource("BoxShape3D_uwrxv") + +[node name="Player" type="CharacterBody3D" parent="." unique_id=612572257 node_paths=PackedStringArray("GameMenu")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5.1320534, 0.7854848) +script = ExtResource("1_uwrxv") +GameMenu = NodePath("../GameMenu") + +[node name="Camera" type="Camera3D" parent="Player" unique_id=1097983892] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0) +fov = 90.0 + +[node name="PlayerMesh" type="MeshInstance3D" parent="Player" unique_id=1440613415] +mesh = SubResource("CapsuleMesh_8cj0n") + +[node name="PlayerCollider" type="CollisionShape3D" parent="Player" unique_id=886478863] +shape = SubResource("CapsuleShape3D_uwrxv") + +[node name="GravityReceiver" type="Node3D" parent="Player" unique_id=1963556576] +script = ExtResource("3_lnu2h") + +[node name="OmniLight" type="OmniLight3D" parent="." unique_id=1887866205] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6497431, -4.41529) +omni_range = 95.383 +omni_attenuation = 0.254 + +[node name="GeneralControlManager" type="Node" parent="." unique_id=1751385863 node_paths=PackedStringArray("GameMenu")] +script = ExtResource("4_lbhrr") +GameMenu = NodePath("../GameMenu") + +[node name="GameMenu" type="Control" parent="." unique_id=223510406] +visible = false +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("5_iywne") + +[node name="Overlay" type="ColorRect" parent="GameMenu" unique_id=255916820] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.2509804) + +[node name="VBoxContainer" type="VBoxContainer" parent="GameMenu" unique_id=502136213] +layout_mode = 0 +offset_left = 32.0 +offset_top = 32.0 +offset_right = 128.0 +offset_bottom = 63.0 + +[node name="MainMenuButton" type="Button" parent="GameMenu/VBoxContainer" unique_id=1125420773] +layout_mode = 2 +text = "Main Menu" + +[connection signal="body_entered" from="Plane2/GravityZone" to="Plane2/GravityZone" method="OnBodyEntered"] +[connection signal="body_exited" from="Plane2/GravityZone" to="Plane2/GravityZone" method="OnBodyExited"] +[connection signal="body_entered" from="Plane/GravityZone" to="Plane/GravityZone" method="OnBodyEntered"] +[connection signal="body_exited" from="Plane/GravityZone" to="Plane/GravityZone" method="OnBodyExited"] +[connection signal="pressed" from="GameMenu/VBoxContainer/MainMenuButton" to="GameMenu" method="OnMainMenu"] diff --git a/scenes/main_menu.tscn b/scenes/main_menu.tscn new file mode 100644 index 0000000..31a8acf --- /dev/null +++ b/scenes/main_menu.tscn @@ -0,0 +1,35 @@ +[gd_scene format=3 uid="uid://bnmh1mebldx4l"] + +[ext_resource type="Script" uid="uid://b7inoxterktk3" path="res://scripts/MainMenu/MainMenuController.cs" id="1_l6cm7"] + +[node name="MainMenu" type="Control" unique_id=1620629749] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_l6cm7") + +[node name="CenterContainer" type="CenterContainer" parent="." unique_id=601944177] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer" unique_id=180209254] +layout_mode = 2 +alignment = 1 + +[node name="StartGameButton" type="Button" parent="CenterContainer/VBoxContainer" unique_id=364461644] +layout_mode = 2 +text = "Start Game" + +[node name="ExitGameButton" type="Button" parent="CenterContainer/VBoxContainer" unique_id=1050417063] +layout_mode = 2 +text = "Exit Game" + +[connection signal="pressed" from="CenterContainer/VBoxContainer/StartGameButton" to="." method="OnStartGame"] +[connection signal="pressed" from="CenterContainer/VBoxContainer/ExitGameButton" to="." method="OnExitGame"] diff --git a/scripts/Constants.cs b/scripts/Constants.cs new file mode 100644 index 0000000..d2ebdd9 --- /dev/null +++ b/scripts/Constants.cs @@ -0,0 +1,3 @@ +public static partial class Constants +{ +} diff --git a/scripts/Constants.cs.uid b/scripts/Constants.cs.uid new file mode 100644 index 0000000..e87393f --- /dev/null +++ b/scripts/Constants.cs.uid @@ -0,0 +1 @@ +uid://dxtvl7k4e3nn4 diff --git a/scripts/GameMenuController.cs b/scripts/GameMenuController.cs new file mode 100644 index 0000000..d5320c1 --- /dev/null +++ b/scripts/GameMenuController.cs @@ -0,0 +1,9 @@ +using Godot; + +public partial class GameMenuController : Control +{ + public void OnMainMenu() + { + GetTree().ChangeSceneToFile("res://scenes/main_menu.tscn"); + } +} diff --git a/scripts/GameMenuController.cs.uid b/scripts/GameMenuController.cs.uid new file mode 100644 index 0000000..c736551 --- /dev/null +++ b/scripts/GameMenuController.cs.uid @@ -0,0 +1 @@ +uid://betypbypf6bf2 diff --git a/scripts/GeneralControlManager.cs b/scripts/GeneralControlManager.cs new file mode 100644 index 0000000..19bf5aa --- /dev/null +++ b/scripts/GeneralControlManager.cs @@ -0,0 +1,41 @@ +using Godot; + +public partial class GeneralControlManager : Node +{ + [Export] Control GameMenu; + + public override void _Ready() + { + Input.MouseMode = Input.MouseModeEnum.Captured; + } + + public override void _Input(InputEvent @event) + { + if (@event.IsActionPressed("ui_cancel")) + { + if (GameMenu.Visible) + { + HideMenu(); + } + else + { + ShowMenu(); + } + return; + } + } + + public void ShowMenu() + { + GameMenu.Show(); + + Input.MouseMode = Input.MouseModeEnum.Visible; + } + + public void HideMenu() + { + GameMenu.Hide(); + + Input.MouseMode = Input.MouseModeEnum.Captured; + } +} diff --git a/scripts/GeneralControlManager.cs.uid b/scripts/GeneralControlManager.cs.uid new file mode 100644 index 0000000..7694a93 --- /dev/null +++ b/scripts/GeneralControlManager.cs.uid @@ -0,0 +1 @@ +uid://n557xfrv0i6x diff --git a/scripts/GravityReceiver.cs b/scripts/GravityReceiver.cs new file mode 100644 index 0000000..94eab20 --- /dev/null +++ b/scripts/GravityReceiver.cs @@ -0,0 +1,22 @@ +using Godot; + +public partial class GravityReceiver : Node3D +{ + public bool InGravityZone = false; + public float GravityStrength = 0f; + public Vector3 GravityDirection = Vector3.Down; + + public void EnterGravityZone(float gravityStrength, Vector3 gravityDirection) + { + InGravityZone = true; + GravityStrength = gravityStrength; + GravityDirection = gravityDirection; + } + + public void ExitGravityZone() + { + InGravityZone = false; + GravityStrength = 0f; + GravityDirection = Vector3.Down; + } +} diff --git a/scripts/GravityReceiver.cs.uid b/scripts/GravityReceiver.cs.uid new file mode 100644 index 0000000..34b16fb --- /dev/null +++ b/scripts/GravityReceiver.cs.uid @@ -0,0 +1 @@ +uid://bwpdtkgmwjs7g diff --git a/scripts/GravityZone.cs b/scripts/GravityZone.cs new file mode 100644 index 0000000..37d5d7d --- /dev/null +++ b/scripts/GravityZone.cs @@ -0,0 +1,16 @@ +using Godot; + +public partial class GravityZone : Area3D +{ + public void OnBodyEntered(Node3D body) + { + GravityReceiver receiver = body.GetNodeOrNull("GravityReceiver"); + receiver?.EnterGravityZone(Gravity, GlobalTransform.Basis.Y); + } + + public void OnBodyExited(Node3D body) + { + GravityReceiver receiver = body.GetNodeOrNull("GravityReceiver"); + receiver?.ExitGravityZone(); + } +} diff --git a/scripts/GravityZone.cs.uid b/scripts/GravityZone.cs.uid new file mode 100644 index 0000000..73ef3d3 --- /dev/null +++ b/scripts/GravityZone.cs.uid @@ -0,0 +1 @@ +uid://cy8nuarxbnd diff --git a/scripts/Helpers.cs b/scripts/Helpers.cs new file mode 100644 index 0000000..c1cfad6 --- /dev/null +++ b/scripts/Helpers.cs @@ -0,0 +1,3 @@ +public static partial class Helpers +{ +} diff --git a/scripts/Helpers.cs.uid b/scripts/Helpers.cs.uid new file mode 100644 index 0000000..faf8c81 --- /dev/null +++ b/scripts/Helpers.cs.uid @@ -0,0 +1 @@ +uid://de2nkadeybqn0 diff --git a/scripts/MainMenu/MainMenuController.cs b/scripts/MainMenu/MainMenuController.cs new file mode 100644 index 0000000..970fe6a --- /dev/null +++ b/scripts/MainMenu/MainMenuController.cs @@ -0,0 +1,14 @@ +using Godot; + +public partial class MainMenuController : Node +{ + public void OnStartGame() + { + GetTree().ChangeSceneToFile("res://scenes/game.tscn"); + } + + public void OnExitGame() + { + GetTree().Quit(); + } +} diff --git a/scripts/MainMenu/MainMenuController.cs.uid b/scripts/MainMenu/MainMenuController.cs.uid new file mode 100644 index 0000000..65a044c --- /dev/null +++ b/scripts/MainMenu/MainMenuController.cs.uid @@ -0,0 +1 @@ +uid://b7inoxterktk3 diff --git a/scripts/Player.cs b/scripts/Player.cs new file mode 100644 index 0000000..b00bd12 --- /dev/null +++ b/scripts/Player.cs @@ -0,0 +1,200 @@ +using Godot; + +public partial class Player : CharacterBody3D +{ + [Export] Control GameMenu; + + [Export] public float Speed = 5f; + [Export] public float JumpForce = 5f; + [Export] public float MouseSensitivity = 0.2f; + + private Vector3 gravityVelocity = Vector3.Zero; + private Vector3 movementVelocity = Vector3.Zero; + private float cameraPitch = 0f; + private Camera3D camera; + private GravityReceiver gravityReceiver; + + public override void _Ready() + { + camera = GetNode("Camera"); + gravityReceiver = GetNode("GravityReceiver"); + } + + public override void _PhysicsProcess(double delta) + { + Vector3 newGravityVelocity = gravityVelocity; + Vector3 newMovementVelocity = movementVelocity; + + if (IsInGravity()) + { + ProcessGravity(delta, ref newGravityVelocity); + if (!GameMenu.Visible) + { + ProcessControlsGravity(ref newGravityVelocity, ref newMovementVelocity); + } + } + else + { + newGravityVelocity = Vector3.Zero; + + ProcessCamera(delta); + if (!GameMenu.Visible) + { + ProcessControls(ref newMovementVelocity); + } + } + + gravityVelocity = newGravityVelocity; + movementVelocity = newMovementVelocity; + Velocity = newGravityVelocity + newMovementVelocity; + + MoveAndSlide(); + } + + public override void _Input(InputEvent @event) + { + if (GameMenu.Visible) + { + return; + } + + if (@event is InputEventMouseMotion motion) + { + float yawDelta = -motion.Relative.X * MouseSensitivity; + float yawDeltaRad = Mathf.DegToRad(yawDelta); + float pitchDelta = -motion.Relative.Y * MouseSensitivity; + float pitchDeltaRad = Mathf.DegToRad(pitchDelta); + + RotateObjectLocal(Vector3.Up, yawDeltaRad); + + if (IsInGravity()) + { + cameraPitch = Mathf.Clamp(cameraPitch + pitchDelta, -90f, 90f); + } + else + { + RotateObjectLocal(Vector3.Right, pitchDeltaRad); + } + + camera.RotationDegrees = new Vector3(cameraPitch, 0, 0); + } + } + + public bool IsInGravity() + { + return gravityReceiver.InGravityZone && gravityReceiver.GravityStrength > 0f; + } + + public bool IsOnGravityFloor() + { + for (int i = 0; i < GetSlideCollisionCount(); i++) + { + KinematicCollision3D collision = GetSlideCollision(i); + Vector3 collisionNormal = collision.GetNormal(); + + float alignment = collisionNormal.Dot(gravityReceiver.GravityDirection); + + if (alignment > 0.7f) + { + return true; + } + } + + return false; + } + + private void ProcessGravity(double delta, ref Vector3 newGravityVelocity) + { + if (!IsOnGravityFloor()) + { + newGravityVelocity -= gravityReceiver.GravityDirection * gravityReceiver.GravityStrength * (float)delta; + } + else + { + newGravityVelocity = -gravityReceiver.GravityDirection; + } + + Vector3 currentUp = GlobalTransform.Basis.Y; + Vector3 targetUp = gravityReceiver.GravityDirection; + + Vector3 axis = currentUp.Cross(targetUp); + if (axis.Length() < 0.00001f) + { + return; + } + float angle = currentUp.AngleTo(targetUp); + + Rotate(axis.Normalized(), angle * (float)delta * 10f); + } + + private void ProcessCamera(double delta) + { + if (cameraPitch > 0.01f) + { + cameraPitch -= 90f * (float)delta; + } + else if (cameraPitch < -0.001f) + { + cameraPitch += 90f * (float)delta; + } + if (Mathf.Abs(cameraPitch) < 1f) + { + cameraPitch = 0f; + } + camera.RotationDegrees = new Vector3(cameraPitch, 0, 0); + } + + private void ProcessControlsGravity(ref Vector3 newGravityVelocity, ref Vector3 newMovementVelocity) + { + float inputX = Input.GetAxis("move_left", "move_right"); + float inputZ = Input.GetAxis("move_forward", "move_back"); + + Vector3 direction = Transform.Basis.X * inputX + Transform.Basis.Z * inputZ; + + if (direction != Vector3.Zero) + { + newMovementVelocity.X = direction.X * Speed; + newMovementVelocity.Y = direction.Y * Speed; + newMovementVelocity.Z = direction.Z * Speed; + } + else + { + newMovementVelocity.X = 0f; + newMovementVelocity.Y = 0f; + newMovementVelocity.Z = 0f; + } + + if (Input.IsActionJustPressed("jump") && IsOnGravityFloor()) + { + newGravityVelocity = gravityReceiver.GravityDirection * JumpForce; + } + } + + private void ProcessControls(ref Vector3 newMovementVelocity) + { + float inputX = Input.GetAxis("move_left", "move_right"); + float inputY = -Input.GetAxis("move_up", "move_down"); + float inputZ = Input.GetAxis("move_forward", "move_back"); + + Vector3 direction = Transform.Basis.X * inputX + Transform.Basis.Y * inputY + Transform.Basis.Z * inputZ; + + if (direction != Vector3.Zero) + { + newMovementVelocity.X = direction.X * Speed; + newMovementVelocity.Y = direction.Y * Speed; + newMovementVelocity.Z = direction.Z * Speed; + } + else + { + newMovementVelocity.X = 0f; + newMovementVelocity.Y = 0f; + newMovementVelocity.Z = 0f; + } + + float inputRotateZ = Input.GetAxis("rotate_left", "rotate_right"); + + float rotateAmountZ = Mathf.DegToRad(inputRotateZ); + + RotateObjectLocal(Vector3.Forward, rotateAmountZ); + } +} diff --git a/scripts/Player.cs.uid b/scripts/Player.cs.uid new file mode 100644 index 0000000..1d81a8c --- /dev/null +++ b/scripts/Player.cs.uid @@ -0,0 +1 @@ +uid://cue3c56axvyja