PokemonLike/Library/Characters/CharacterMovement.cs

89 lines
2.4 KiB
C#
Raw Permalink Normal View History

2025-04-11 13:35:55 -05:00
using Godot;
using System;
using PokemonLike.Library.Support;
namespace PokemonLike.Library.Characters;
[GlobalClass]
public partial class CharacterMovement : Node
{
[Signal]
public delegate void AnimationEventHandler(string animationType);
[ExportCategory("Nodes")]
[Export] public CharacterBody2D Character;
[Export] public CharacterInput CharacterInput;
2025-04-11 17:01:53 -05:00
[Export] public CharacterCollisionRayCast CharacterCollisionRayCast;
2025-04-11 13:35:55 -05:00
[ExportCategory("Movement")]
[Export] public Vector2 TargetPosition = Vector2.Zero;
[Export] public bool IsWalking = false;
2025-04-11 17:01:53 -05:00
[Export] public bool CollisionDetected = false;
2025-04-11 13:35:55 -05:00
public override void _Ready()
{
CharacterInput.Walk += StartWalking;
CharacterInput.Turn += Turn;
2025-04-11 17:01:53 -05:00
CharacterCollisionRayCast.Collision += (value) => CollisionDetected = value;
Logger.Info("Loading character movement component ...");
2025-04-11 13:35:55 -05:00
}
public override void _Process(double delta)
{
Walk(delta);
}
public bool IsMoving() => IsWalking;
2025-04-11 17:01:53 -05:00
public bool IsColliding() => CollisionDetected;
2025-04-11 13:35:55 -05:00
public void StartWalking()
{
2025-04-11 17:01:53 -05:00
if (!IsMoving() && !IsColliding())
2025-04-11 13:35:55 -05:00
{
EmitSignal(SignalName.Animation, "walk");
TargetPosition = Character.Position + CharacterInput.Direction * Globals.Instance.GRID_SIZE;
Logger.Debug($"Moving from {Character.Position} to {TargetPosition}");
IsWalking = true;
}
}
public void Walk(double delta)
{
if (IsWalking)
{
Character.Position =
Character.Position.MoveToward(TargetPosition, (float)delta * Globals.Instance.GRID_SIZE * 4);
if (Character.Position.DistanceTo(TargetPosition) < 1f)
{
StopWalking();
}
}
else
{
EmitSignal(SignalName.Animation, "idle");
}
}
public void StopWalking()
{
IsWalking = false;
SnapPositionToGrid();
}
public void Turn()
{
EmitSignal(SignalName.Animation, "turn");
}
public void SnapPositionToGrid()
{
Character.Position = new Vector2(
Mathf.Round(Character.Position.X / Globals.Instance.GRID_SIZE) * Globals.Instance.GRID_SIZE,
Mathf.Round(Character.Position.Y / Globals.Instance.GRID_SIZE) * Globals.Instance.GRID_SIZE
);
}
}