You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Babushka/scripts/CSharp/Common/CharacterControls/Player3D.cs

117 lines
2.8 KiB

using Godot;
namespace Babushka.scripts.CSharp.Common.CharacterControls;
public partial class Player3D : CharacterBody3D
{
[Export] private float _speed = 1.0f;
[Export] private Camera3D _camera;
/// <summary>
/// The sprite arrays are all setup like this:
/// 0 - idle
/// 1 - walking
/// </summary>
[Export] private AnimatedSprite3D[] _frontSpritesAnimated;
[Export] private AnimatedSprite3D[] _sideSpritesAnimated;
[Export] private AnimatedSprite3D[] _backSpritesAnimated;
private bool _sideFlipped;
public override void _PhysicsProcess(double delta)
{
var inputDir = Input.GetVector("move_left", "move_right", "move_up", "move_down");
if (inputDir == Vector2.Zero)
return;
MoveOnInput(inputDir, delta);
SwitchSprites(inputDir);
}
private void MoveOnInput(Vector2 inputDir, double delta)
{
inputDir = inputDir.Rotated(-_camera.GlobalRotation.Y);
var direction = (Transform.Basis * new Vector3(inputDir.X, 0, inputDir.Y)).Normalized();
if (direction != Vector3.Zero)
Velocity = new Vector3(direction.X * _speed * (float) delta * Scale.X, Velocity.Y, direction.Z * _speed * (float) delta * Scale.Z);
else
Velocity = Velocity.MoveToward(new Vector3(0, 0, 0), _speed);
MoveAndSlide();
}
private void SwitchSprites(Vector2 inputDir)
{
float X = inputDir.X;
float Y = inputDir.Y;
if (X == 0.0 && Y == 0.0)
{
ActivateFrontSpriteIdle(0, true, false, false);
return;
}
if (X != 0)
{
ActivateFrontSpriteIdle(1, false, true, false);
if (X > 0.0f)
{
_sideFlipped = false;
}
if (X < 0.0f)
{
_sideFlipped = true;
}
foreach (var animatedSprite in _sideSpritesAnimated)
{
animatedSprite.FlipH = _sideFlipped;
}
return;
}
if (Y != 0)
{
if (Y < 0.0f)
{
ActivateFrontSpriteIdle(1, false, false, true);
}
if (Y > 0.0f)
{
ActivateFrontSpriteIdle(0, true, false, false);
}
}
}
private void ActivateFrontSpriteIdle(int index, bool frontActive, bool sideActive, bool backActive)
{
DeactivateAll();
_frontSpritesAnimated[index].Visible = frontActive;
_sideSpritesAnimated[index].Visible = sideActive;
_backSpritesAnimated[index].Visible = backActive;
}
private void DeactivateAll()
{
foreach (var animatedSprite in _frontSpritesAnimated)
{
animatedSprite.Visible = false;
}
foreach (var animatedSprite in _sideSpritesAnimated)
{
animatedSprite.Visible = false;
}
foreach (var animatedSprite in _backSpritesAnimated)
{
animatedSprite.Visible = false;
}
}
}