using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Graphics.TwoDimensional.Abstract; namespace Syntriax.Engine.Graphics.TwoDimensional; public class DisplayableSpriteBehaviour : Behaviour, IDisplayableSprite, IAssignableSprite { public Action? OnSpriteAssigned { get; set; } = null; public Action? OnSpriteEffectsChanged { get; set; } = null; public Action? OnOriginChanged { get; set; } = null; public Action? OnColorChanged { get; set; } = null; public Action? OnDepthChanged { get; set; } = null; private ISprite _sprite = null!; private Color _color = Color.White; private float _depth = 0f; private SpriteEffects _spriteEffects = SpriteEffects.None; private Vector2 _origin = Vector2.One * .5f; public ISprite Sprite => _sprite; public SpriteEffects SpriteEffects { get => _spriteEffects; set { if (_spriteEffects == value) return; _spriteEffects = value; OnSpriteEffectsChanged?.Invoke(this); } } public Vector2 Origin { get => _origin; set { if (_origin == value) return; _origin = value; OnOriginChanged?.Invoke(this); } } public Color Color { get => _color; set { if (_color == value) return; _color = value; OnColorChanged?.Invoke(this); } } public float Depth { get => _depth; set { if (_depth == value) return; _depth = value; OnDepthChanged?.Invoke(this); } } public void Draw(SpriteBatch spriteBatch) { if (!BehaviourController.GameObject.StateEnable.Enabled || !StateEnable.Enabled) return; ITransform transform = BehaviourController.GameObject.Transform; Vector2 position = transform.Position; Vector2 scale = transform.Scale; Rectangle rectangle = new Rectangle((int)position.X, -(int)position.Y, (int)(Sprite.Texture2D.Width * scale.X), (int)(Sprite.Texture2D.Height * scale.Y)); spriteBatch.Draw(Sprite.Texture2D, rectangle, null, Color, transform.Rotation, new Vector2(Sprite.Texture2D.Width, Sprite.Texture2D.Height) * Origin, SpriteEffects, Depth); } public bool Assign(ISprite sprite) { _sprite = sprite; OnSpriteAssigned?.Invoke(this); return true; } public DisplayableSpriteBehaviour() => OnUnassigned += OnUnassign; public DisplayableSpriteBehaviour( Color? color = null, float? depth = null, SpriteEffects? spriteEffects = null, Vector2? origin = null) { OnUnassigned += OnUnassign; _color = color ?? _color; _depth = depth ?? _depth; _spriteEffects = spriteEffects ?? _spriteEffects; _origin = origin ?? _origin; } private void OnUnassign(IAssignable assignable) => _sprite = null!; }