mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-01 09:37:03 +02:00
65 lines
2.0 KiB
C#
65 lines
2.0 KiB
C#
using Robust.Client.Graphics;
|
|
using Robust.Client.Utility;
|
|
using Robust.Shared.Graphics;
|
|
using Robust.Shared.Graphics.RSI;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Timing;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Robust.Client.UserInterface.Controls
|
|
{
|
|
/// <summary>
|
|
/// A more complex control wrapping <see cref="TextureRect"/> that can do RSI directions and animations.
|
|
/// </summary>
|
|
public sealed class AnimatedTextureRect : Control
|
|
{
|
|
private IRsiStateLike? _state;
|
|
private int _curFrame;
|
|
private float _curFrameTime;
|
|
|
|
/// <summary>
|
|
/// Internal TextureRect used to do actual drawing of the texture.
|
|
/// You can use this property to change shaders or styling or such.
|
|
/// </summary>
|
|
public TextureRect DisplayRect { get; }
|
|
|
|
public RsiDirection RsiDirection { get; } = RsiDirection.South;
|
|
|
|
public AnimatedTextureRect()
|
|
{
|
|
IoCManager.InjectDependencies(this);
|
|
|
|
DisplayRect = new TextureRect();
|
|
AddChild(DisplayRect);
|
|
}
|
|
|
|
public void SetFromSpriteSpecifier(SpriteSpecifier specifier)
|
|
{
|
|
_curFrame = 0;
|
|
_state = specifier.RsiStateLike();
|
|
_curFrameTime = _state.GetDelay(0);
|
|
DisplayRect.Texture = _state.GetFrame(RsiDirection, 0);
|
|
}
|
|
|
|
protected override void FrameUpdate(FrameEventArgs args)
|
|
{
|
|
if (!VisibleInTree || _state == null || !_state.IsAnimated)
|
|
return;
|
|
|
|
var oldFrame = _curFrame;
|
|
|
|
_curFrameTime -= args.DeltaSeconds;
|
|
while (_curFrameTime < _state.GetDelay(_curFrame))
|
|
{
|
|
_curFrame = (_curFrame + 1) % _state.AnimationFrameCount;
|
|
_curFrameTime += _state.GetDelay(_curFrame);
|
|
}
|
|
|
|
if (_curFrame != oldFrame)
|
|
{
|
|
DisplayRect.Texture = _state.GetFrame(RsiDirection, _curFrame);
|
|
}
|
|
}
|
|
}
|
|
}
|