using System.Numerics; using Raylib_cs; namespace OnekoOnline; abstract class Drawable : IDisposable { protected int DrawOrder = 0; public bool Visible = true; public Vector2 Position { get => _position; set => _position = value.Round(); } private Vector2 _position; public Vector2 Size; public float Rotation = 0f; public static readonly HashSet Drawables = []; public Drawable() => Drawables.Add(this); public static void DrawAll() { float delta = Raylib.GetFrameTime(); foreach (Drawable drawable in Drawables.OrderBy(d => d.Position.Y + d.DrawOrder*1000)) { drawable?.Update(delta); if (drawable == null || !drawable.Visible) continue; drawable?.Draw(); } } public static void DisposeAll() { foreach (Drawable drawable in Drawables.ToArray()) drawable?.Dispose(); Drawables.Clear(); } public abstract void Draw(); public abstract void Update(float delta); bool disposed = false; public void Dispose() { if (disposed) return; Unload(); Drawables.Remove(this); GC.SuppressFinalize(this); disposed = true; } protected abstract void Unload(); ~Drawable() => Dispose(); }