gd: dash target

This commit is contained in:
2025-05-23 16:00:20 +02:00
parent db20eaac85
commit 6ed8ebff26
6 changed files with 129 additions and 21 deletions

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=23 format=3 uid="uid://bei4nhkf8lwdo"]
[gd_scene load_steps=25 format=3 uid="uid://bei4nhkf8lwdo"]
[ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"]
[ext_resource type="Material" uid="uid://dtq8i1ka1f2pn" path="res://player_controller/Assets/Materials/Health/CameraVignette.tres" id="2_6hee7"]
@ -9,6 +9,7 @@
[ext_resource type="Script" uid="uid://cwbvxlfvmocc1" path="res://player_controller/Scripts/StairsSystem.cs" id="7_bmt5a"]
[ext_resource type="Script" uid="uid://dd1yrt7eiiyf4" path="res://player_controller/Scripts/CapsuleCollider.cs" id="8_lmtjd"]
[ext_resource type="Script" uid="uid://bt0xv2q8iv1vn" path="res://player_controller/Scripts/Gravity.cs" id="9_lsueh"]
[ext_resource type="Script" uid="uid://dwoppk8j5fxeg" path="res://player_controller/Scripts/DashSystem.cs" id="9_qu4wy"]
[ext_resource type="Script" uid="uid://g8idirw62qe0" path="res://player_controller/Scripts/Bobbing.cs" id="10_7wk1w"]
[ext_resource type="Script" uid="uid://c6bx47wr7fbdm" path="res://player_controller/Scripts/Mouse.cs" id="11_huhen"]
[ext_resource type="Script" uid="uid://b6k73aj5povgv" path="res://player_controller/Scripts/FieldOfView.cs" id="12_m2mxi"]
@ -26,6 +27,9 @@ shader_parameter/blur = 0.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_4coqe"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_qu4wy"]
height = 1.5
[sub_resource type="Animation" id="Animation_vcu7l"]
length = 0.001
tracks/0/type = "bezier"
@ -114,6 +118,7 @@ _data = {
script = ExtResource("1_poq2x")
WalkSpeed = 10.0
SprintSpeed = 15.0
ControllerSensitivity = 30.0
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
@ -197,14 +202,20 @@ debug_shape_custom_color = Color(1, 0, 0, 1)
[node name="WallInFrontCast3D" type="ShapeCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
shape = SubResource("CapsuleShape3D_4coqe")
target_position = Vector3(0, 0, -2)
debug_shape_custom_color = Color(1, 0, 0, 1)
shape = SubResource("CapsuleShape3D_qu4wy")
target_position = Vector3(0, 0, -1.5)
max_results = 1
debug_shape_custom_color = Color(0.911631, 0.11884, 0.656218, 1)
[node name="WallInFrontRayCast3D" type="RayCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 1.65, 0)
enabled = false
target_position = Vector3(0, -2, 0)
[node name="DashSystem" type="Node3D" parent="."]
script = ExtResource("9_qu4wy")
[node name="DashCast3D" type="ShapeCast3D" parent="DashSystem"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.68, 0)
shape = SubResource("CapsuleShape3D_qu4wy")
target_position = Vector3(0, 0, -20)
max_results = 1
debug_shape_custom_color = Color(0.911631, 0.11884, 0.656218, 1)
[node name="StairsSystem" type="Node3D" parent="."]
script = ExtResource("7_bmt5a")

View File

@ -0,0 +1,35 @@
using Godot;
using RustyOptions;
namespace PolarBears.PlayerControllerAddon;
public partial class DashSystem: Node3D
{
[Export(PropertyHint.Range, "0,0.2,0.01,or_greater")]
public float DashSpeed { get; set; } = 0.05f;
private Node3D _head;
private ShapeCast3D _dashCast3D;
private Camera3D _camera;
public void Init(Node3D head, Camera3D camera)
{
_dashCast3D = GetNode<ShapeCast3D>("DashCast3D");
_head = head;
_camera = camera;
}
public Result<Vector3, string> PrepareDash()
{
_dashCast3D.SetRotation(new Vector3(
_camera.Rotation.X,
_head.Rotation.Y,
_camera.Rotation.Z));
var dashLocation = _dashCast3D.IsColliding()
? _dashCast3D.GetCollisionPoint(0)
: _dashCast3D.GetTargetPosition();
return Result.Ok(dashLocation);
}
}

View File

@ -0,0 +1 @@
uid://dwoppk8j5fxeg

View File

@ -24,6 +24,20 @@ public partial class Mouse : Node3D
_isPlayerDead = isDeadFunc;
}
public void LookAround(Vector2 lookDir)
{
// Horizontal movement of head
float angleForHorizontalRotation = lookDir.X * Sensitivity;
_head.RotateY(angleForHorizontalRotation);
// Vertical movement of head
Vector3 currentCameraRotation = _camera.Rotation;
currentCameraRotation.X += Convert.ToSingle(lookDir.Y * Sensitivity);
currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f));
_camera.Rotation = currentCameraRotation;
}
public override void _UnhandledInput(InputEvent @event)
{
if (_isPlayerDead())
@ -33,16 +47,8 @@ public partial class Mouse : Node3D
if (@event is InputEventMouseMotion eventMouseMotion)
{
// Horizontal movement of head
float angleForHorizontalRotation = -eventMouseMotion.Relative.X * Sensitivity;
_head.RotateY(angleForHorizontalRotation);
// Vertical movement of head
Vector3 currentCameraRotation = _camera.Rotation;
currentCameraRotation.X += Convert.ToSingle(-eventMouseMotion.Relative.Y * Sensitivity);
currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f));
_camera.Rotation = currentCameraRotation;
var lookDir = new Vector2(-eventMouseMotion.Relative.X, -eventMouseMotion.Relative.Y);
LookAround(lookDir);
}
}
}

View File

@ -11,6 +11,7 @@ public partial class PlayerController : CharacterBody3D
public Stamina Stamina;
public StairsSystem StairsSystem;
public MantleSystem MantleSystem;
public DashSystem DashSystem;
public CapsuleCollider CapsuleCollider;
public Gravity Gravity;
public HealthSystem HealthSystem;
@ -27,8 +28,12 @@ public partial class PlayerController : CharacterBody3D
[Export(PropertyHint.Range, "0,5,0.1,or_greater")]
public float DoubleJumpSpeedFactor { get; set; } = 2f;
[Export(PropertyHint.Range, "1,50,1,or_greater")]
public float ControllerSensitivity { get; set; } = 20f;
private bool _canDoubleJump = true;
private bool _movementEnabled = true;
private float _currentSpeed;
@ -95,6 +100,9 @@ public partial class PlayerController : CharacterBody3D
MantleSystem = GetNode<MantleSystem>("MantleSystem");
MantleSystem.Init(wallInFrontCast3D, Head, mantleCast3D);
DashSystem = GetNode<DashSystem>("DashSystem");
DashSystem.Init(Head, camera);
CapsuleCollider = GetNode<CapsuleCollider>("CapsuleCollider");
@ -121,8 +129,19 @@ public partial class PlayerController : CharacterBody3D
Mouse.Init(Head, camera, HealthSystem.IsDead);
}
private void DisableMovement()
{
_movementEnabled = false;
}
public void EnableMovement()
{
_movementEnabled = true;
}
public override void _PhysicsProcess(double delta)
{
var dashLocation = DashSystem.PrepareDash().Unwrap();
var mantleLocationResult = MantleSystem.CheckWallInFront();
if (isOnFloorCustom())
{
@ -143,14 +162,22 @@ public partial class PlayerController : CharacterBody3D
bool isPlayerDead = HealthSystem.IsDead();
// Handle Jumping
// Handle Jump input
if (Input.IsActionJustPressed("jump")
&& !doesCapsuleHaveCrouchingHeight
&& !isPlayerDead)
{
if (mantleLocationResult.IsOk(out var mantleLocation))
{
Position = mantleLocation;
Tween tween = GetTree().CreateTween();
var duration = 0.1f * mantleLocation.DistanceTo(Position);
var callback = new Callable(this, MethodName.EnableMovement);
tween.TweenProperty(this, "position", mantleLocation, duration);
tween.TweenCallback(callback);
DisableMovement();
tween.Play();
}
else if (isOnFloorCustom())
{
@ -170,7 +197,6 @@ public partial class PlayerController : CharacterBody3D
}
}
bool isHeadTouchingCeiling = IsHeadTouchingCeiling();
bool doesCapsuleHaveDefaultHeight = CapsuleCollider.IsDefaultHeight();
@ -209,6 +235,9 @@ public partial class PlayerController : CharacterBody3D
{
_currentSpeed = SprintSpeed;
}
Vector2 inputLookDir = Input.GetVector("look_left", "look_right", "look_up", "look_down");
Mouse.LookAround(-1 * ControllerSensitivity * inputLookDir);
// Get the input direction
Vector2 inputDir = Input.GetVector("left", "right", "up", "down");