2023-11-27 10:37:39 +03:00
|
|
|
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<IAssignableSprite>? OnSpriteAssigned { get; set; } = null;
|
|
|
|
public Action<IDisplayableSprite>? OnSpriteEffectsChanged { get; set; } = null;
|
|
|
|
public Action<IDisplayableSprite>? OnOriginChanged { get; set; } = null;
|
|
|
|
public Action<IDisplayableSprite>? OnColorChanged { get; set; } = null;
|
|
|
|
public Action<IDisplayableSprite>? 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;
|
|
|
|
|
2023-11-27 13:46:01 +03:00
|
|
|
Rectangle rectangle = new Rectangle((int)position.X, -(int)position.Y, (int)(Sprite.Texture2D.Width * scale.X), (int)(Sprite.Texture2D.Height * scale.Y));
|
2023-11-27 10:37:39 +03:00
|
|
|
|
2023-11-27 15:12:04 +03:00
|
|
|
spriteBatch.Draw(Sprite.Texture2D, rectangle, null, Color, transform.Rotation, new Vector2(Sprite.Texture2D.Width, Sprite.Texture2D.Height) * Origin, SpriteEffects, Depth);
|
2023-11-27 10:37:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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!;
|
|
|
|
}
|