Movement refactor
This commit is contained in:
41
scripts/components/Movement/JumpAbility.cs
Normal file
41
scripts/components/Movement/JumpAbility.cs
Normal file
@@ -0,0 +1,41 @@
|
||||
using Godot;
|
||||
|
||||
namespace Mr.BrickAdventures.scripts.components;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class JumpAbility : MovementAbility
|
||||
{
|
||||
[Export] public float JumpVelocity { get; set; } = -400.0f;
|
||||
[Export] public int CoyoteFrames { get; set; } = 6;
|
||||
|
||||
private Timer _coyoteTimer;
|
||||
private bool _wasOnFloor = false;
|
||||
|
||||
public override void Initialize(PlayerController controller)
|
||||
{
|
||||
base.Initialize(controller);
|
||||
_coyoteTimer = new Timer { OneShot = true, WaitTime = CoyoteFrames / (float)Engine.GetPhysicsTicksPerSecond() };
|
||||
AddChild(_coyoteTimer);
|
||||
}
|
||||
|
||||
public override Vector2 ProcessMovement(Vector2 velocity, double delta)
|
||||
{
|
||||
if (!_body.IsOnFloor() && _wasOnFloor)
|
||||
{
|
||||
_coyoteTimer.Start();
|
||||
}
|
||||
|
||||
if (_input.JumpHeld)
|
||||
{
|
||||
if (_body.IsOnFloor() || !_coyoteTimer.IsStopped())
|
||||
{
|
||||
velocity.Y = JumpVelocity;
|
||||
_controller.EmitSignal(PlayerController.SignalName.JumpInitiated);
|
||||
_coyoteTimer.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
_wasOnFloor = _body.IsOnFloor();
|
||||
return velocity;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user