using Godot; namespace Babushka.scripts.CSharp.Common.Animation; public partial class Duck : Node2D { [Export] private CharacterBody2D _characterBody; [Export] private AudioPlayer2D _nakNakAudio; [Export] private AudioPlayer2D _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; } } } }