LADXHD/InGame/GameObjects/Base/Components/AnimationComponent.cs
2023-12-14 17:21:22 -05:00

75 lines
2.4 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.GameObjects.Base.CObjects;
namespace ProjectZ.InGame.GameObjects.Base.Components
{
class AnimationComponent : BaseAnimationComponent
{
public CSprite Sprite;
public Animator Animator;
public Vector2 SpriteOffset;
private bool _mirroredV;
public bool MirroredV
{
get => _mirroredV;
set
{
_mirroredV = value;
UpdateSprite();
}
}
private bool _mirroredH;
public bool MirroredH
{
get => _mirroredH;
set
{
_mirroredH = value;
UpdateSprite();
}
}
public AnimationComponent(Animator animator, CSprite sprite, Vector2 spriteOffset)
{
Animator = animator;
Animator.OnFrameChange = UpdateSprite;
SpriteOffset = spriteOffset;
Sprite = sprite;
Sprite.SprTexture = animator.SprTexture;
UpdateSprite();
}
public void UpdateSprite()
{
var offsetX = MirroredH ? -1 : 1;
Sprite.DrawOffset.X = SpriteOffset.X + (Animator.CurrentAnimation.Offset.X +
Animator.CurrentFrame.Offset.X) * offsetX;
var offsetY = MirroredV ? -1 : 1;
Sprite.DrawOffset.Y = SpriteOffset.Y + (Animator.CurrentAnimation.Offset.Y +
Animator.CurrentFrame.Offset.Y) * offsetY;
if (MirroredH)
Sprite.DrawOffset.X -= Animator.CurrentFrame.SourceRectangle.Width;
if (MirroredV)
Sprite.DrawOffset.Y -= Animator.CurrentFrame.SourceRectangle.Height;
Sprite.SourceRectangle = Animator.CurrentFrame.SourceRectangle;
Sprite.SpriteEffect =
(Animator.CurrentFrame.MirroredV ^ MirroredV ? SpriteEffects.FlipVertically : SpriteEffects.None) |
(Animator.CurrentFrame.MirroredH ^ MirroredH ? SpriteEffects.FlipHorizontally : SpriteEffects.None);
}
public override void UpdateAnimation()
{
Animator.Update();
}
}
}