refactor: movement system - MovementPreset, decouple abilities, fix timing

This commit is contained in:
2026-03-19 02:45:26 +01:00
parent adaeb35fdd
commit 814d9736d0
11 changed files with 58 additions and 95 deletions

View File

@@ -5,26 +5,16 @@ namespace Mr.BrickAdventures.scripts.components;
[GlobalClass]
public partial class DoubleJumpAbility : MovementAbility
{
[Export] public float JumpHeight { get; set; } = 100f;
[Export] public float JumpTimeToPeak { get; set; } = 0.5f;
private bool _hasDoubleJumped = false;
private float _jumpVelocity;
public override void Initialize(PlayerController controller)
{
base.Initialize(controller);
foreach (var ability in _controller.GetActiveAbilities())
{
if (ability is VariableJumpAbility jumpAbility)
{
_jumpVelocity = (2.0f * jumpAbility.JumpHeight) / jumpAbility.JumpTimeToPeak * -1.0f;
break;
}
}
if (_jumpVelocity == 0)
{
_jumpVelocity = -400.0f;
}
_jumpVelocity = (2.0f * JumpHeight) / JumpTimeToPeak * -1.0f;
}
public override Vector2 ProcessMovement(Vector2 velocity, double delta)

View File

@@ -5,8 +5,8 @@ namespace Mr.BrickAdventures.scripts.components;
[GlobalClass]
public partial class GravityAbility : MovementAbility
{
public float AscendGravity { get; set; }
public float DescendGravity { get; set; }
[Export] public float AscendGravity { get; set; } = 980f;
[Export] public float DescendGravity { get; set; } = 1960f;
private float _gravity;

View File

@@ -26,8 +26,6 @@ public partial class GridMovementAbility : MovementAbility
public override Vector2 ProcessMovement(Vector2 currentVelocity, double delta)
{
GD.Print($"Player position: {_body.Position}, {_body.GlobalPosition}");
var inputDirection = _input.MoveDirection;
var newDirection = Vector2.Zero;

View File

@@ -30,8 +30,6 @@ public abstract partial class MovementAbility : Node
SetProcess(false);
SetPhysicsProcess(false);
}
_body.Velocity = Vector2.Zero;
}
public abstract Vector2 ProcessMovement(Vector2 currentVelocity, double delta);

View File

@@ -13,7 +13,7 @@ public partial class PlayerInputHandler : Node
public bool DownReleased { get; private set; }
public bool DownHeld { get; private set; }
public override void _Process(double delta)
public override void _PhysicsProcess(double delta)
{
MoveDirection = Input.GetVector("left", "right", "up", "down");

View File

@@ -7,19 +7,26 @@ public partial class WallJumpAbility : MovementAbility
{
[ExportGroup("Wall Jump Design")]
[Export] public Vector2 WallJumpVelocity { get; set; } = new(500.0f, -350.0f);
[ExportGroup("Wall Slide Feel")]
[Export(PropertyHint.Range, "0.0, 1.0, 0.05")] public float WallSlideGravityMultiplier { get; set; } = 0.7f;
[Export] public float MaxWallSlideSpeed { get; set; } = 150.0f;
private float _gravity;
public override void Initialize(PlayerController controller)
{
base.Initialize(controller);
_gravity = (float)ProjectSettings.GetSetting("physics/2d/default_gravity");
}
public override Vector2 ProcessMovement(Vector2 velocity, double delta)
{
var isOnWall = _body.IsOnWall();
if (isOnWall && !_body.IsOnFloor() && velocity.Y > 0f)
{
var gravity = (float)ProjectSettings.GetSetting("physics/2d/default_gravity");
var newYVelocity = velocity.Y + gravity * WallSlideGravityMultiplier * (float)delta;
var newYVelocity = velocity.Y + _gravity * WallSlideGravityMultiplier * (float)delta;
velocity.Y = Mathf.Min(newYVelocity, MaxWallSlideSpeed);
}