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/Animation/Duck.cs

88 lines
3.0 KiB

using Godot;
namespace Babushka.scripts.CSharp.Common.Animation;
public partial class Duck : Node2D
{
[Export] private CharacterBody2D _characterBody;
[Export] private AudioPlayer _nakNakAudio;
[Export] private AudioPlayer _wingFlapAudio;
[Export] private Node2D _vesna;
[Export] private float _runningSpeed = 3f;
[Export] private float _slowSpeed = 0.5f;
[Export] private float _minDistanceToVesna = 1000f;
[Export] private Node2D _duckRight;
[Export] private Node2D _duckLeft;
private bool _vesnaInReach = false;
private bool _penEntered = false;
private int _numberOfFramesPerDirection = 1000;
private int _currentFramesThisDirection = 0;
private bool _duckLookingRight = true;
private Vector2 _movementVector = Vector2.Zero;
public void PenEntered()
{
_nakNakAudio.PlayOneShot();
_penEntered = true;
}
public override void _Draw()
{
DrawLine(_characterBody.GlobalPosition, _movementVector, new Color(255, 0, 0), 2f, false);
}
public override void _Process(double delta)
{
if (_penEntered)
{
_characterBody.Velocity = Vector2.Zero;
_characterBody.MoveAndSlide();
GD.Print("Pen entered.");
return;
}
float currentDistance = _vesna.GlobalPosition.DistanceTo(_characterBody.GlobalPosition);
if (currentDistance < _minDistanceToVesna)
{
_movementVector = new Vector2( _characterBody.GlobalPosition.X - _vesna.GlobalPosition.X,
_characterBody.GlobalPosition.Y - _vesna.GlobalPosition.Y).Normalized();
_movementVector *= _runningSpeed;
_characterBody.Velocity = _movementVector;
_characterBody.MoveAndSlide();
}
else
{
if (_currentFramesThisDirection >= _numberOfFramesPerDirection)
{
_currentFramesThisDirection = 0;
FastNoiseLite fastNoiseLite = new FastNoiseLite();
_movementVector = new Vector2(fastNoiseLite.GetNoise1D(_characterBody.GlobalPosition.X * Time.GetTicksMsec()), fastNoiseLite.GetNoise1D(_characterBody.GlobalPosition.Y * Time.GetTicksMsec())).Normalized();
}
_currentFramesThisDirection++;
_characterBody.Velocity = _movementVector * _slowSpeed;
_characterBody.MoveAndSlide();
}
// if läuftNachLinks && schautNachRechts || läuftNachRechts && schautNachLinks
if ((_characterBody.Velocity.X < 0 && _duckLookingRight)
|| (_characterBody.Velocity.X > 0 && !_duckLookingRight))
{
if (_duckLookingRight)
{
_duckRight.Visible = false;
_duckLeft.Visible = true;
_duckLookingRight = false;
}
else
{
_duckRight.Visible = true;
_duckLeft.Visible = false;
_duckLookingRight = true;
}
}
}
}