using Godot; using Theriapolis.Core; namespace Theriapolis.GodotHost.Rendering; /// /// Player marker — small dot with a thin facing tick. Drawn at /// /2 wp; the owner sets /// = 1/zoom every frame so the on-screen size /// stays constant across the seamless zoom range. Facing is driven by /// the owner via ; the tick is drawn along /// the local +X axis so rotating the node rotates the tick without /// invalidating the cached _Draw commands. /// public partial class PlayerMarker : Node2D { private const float RadiusWorldPx = C.PLAYER_MARKER_SCREEN_PX * 0.5f; private const float FacingTickPx = RadiusWorldPx * 1.4f; private bool _showFacingTick = true; /// When true, draws a small tick along the local +X axis /// so the player can read facing without a full sprite. Hidden at /// low zoom to avoid clutter. Triggers /// on change. public bool ShowFacingTick { get => _showFacingTick; set { if (_showFacingTick == value) return; _showFacingTick = value; QueueRedraw(); } } public override void _Draw() { DrawCircle(Vector2.Zero, RadiusWorldPx, new Color(0, 0, 0, 0.78f)); DrawCircle(Vector2.Zero, RadiusWorldPx * 0.85f, new Color(0.86f, 0.31f, 0.24f)); if (_showFacingTick) { DrawLine( new Vector2(RadiusWorldPx * 0.4f, 0), new Vector2(FacingTickPx, 0), new Color(1f, 0.96f, 0.86f), width: RadiusWorldPx * 0.18f, antialiased: false); } } }