using Godot; using SupaLidlGame.Extensions; using System; namespace SupaLidlGame.Prototyping; public partial class ContextBasedSteering : Node2D { public float PreferredDistance { get; set; } = 256.0f; Vector2 _direction; // Called when the node enters the scene tree for the first time. public override void _Ready() { GD.Print("Started ContextBasedSteering test"); } // Called every frame. 'delta' is the elapsed time since the previous frame. public override void _Process(double delta) { _direction = GetDirection(); QueueRedraw(); } public Vector2 GetDirection() { float directWeight; float strafeWeight; Vector2 towards = GetGlobalMousePosition() - GlobalPosition; float dist = towards.Length(); Vector2 directDir = towards.Normalized(); Vector2 strafeDir = directDir.Clockwise90(); // weights approach 1 // dy/dx = 1 - y // y = 1 - e^(-x) directWeight = 1 - Mathf.Pow(Mathf.E, -(dist / PreferredDistance)); strafeWeight = 1 - directWeight; /* Vector2 midpoint = (strafeDir * strafeWeight) .Midpoint(directDir * directWeight); */ Vector2 midpoint = (directDir * directWeight) .Midpoint(strafeDir * strafeWeight); return midpoint.Normalized(); } public override void _Draw() { DrawLine(Vector2.Zero, _direction * 256, Colors.Green); } }