A scene component that represents a blood splatter sprite. It picks a random splatter animation and playback speed, randomizes scale and orientation, tracks spawn time (real or game time) and fades the sprite over its Lifetime, removing and destroying itself when expired.
public class BloodSplatter : Component
{
[Property] public Sprite2D Sprite { get; set; }
private TimeSince _spawnTime;
private RealTimeSince _realTimeSinceSpawn;
public float Lifetime { get; set; }
public bool ShouldUseRealTime { get; set; }
protected override void OnAwake()
{
base.OnAwake();
Sprite.PlayAnimation( $"blood_splatter_{Game.Random.Int( 0, 3 )}" );
Sprite.PlaybackSpeed = Sandbox.Game.Random.Float( 4f, 6.5f );
if ( Game.Random.Float( 0f, 1f ) < 0.5f )
Sprite.SpriteFlags = SpriteFlags.HorizontalFlip;
LocalRotation = new Angles( 0f, -90f, 0f );
//LocalScale = new Vector3( Game.Random.Float( 0.4f, 0.6f ), Game.Random.Float( 0.15f, 0.25f ), 1f ) * Globals.SPRITE_SCALE;
LocalScale = new Vector3( Game.Random.Float( 0.33f, 0.48f ), 1f, Game.Random.Float( 0.4f, 0.63f ) ) * 2.2f * Globals.SPRITE_SCALE;
_spawnTime = 0f;
_realTimeSinceSpawn = 0f;
}
protected override void OnUpdate()
{
base.OnUpdate();
if ( !Manager.Instance.ShouldUpdateThings )
return;
var opacity = ShouldUseRealTime
? Utils.Map( _realTimeSinceSpawn, 0f, 1.2f, 0f, 1f )
: Utils.Map( _spawnTime, 0f, 0.14f, 0f, 1f ) * Utils.Map( _spawnTime, 0f, Lifetime - 0.02f, 1f, 0f );
Sprite.Tint = Color.White.WithAlpha( opacity );
if ( _spawnTime > Lifetime )
{
Manager.Instance.RemoveBloodSplatter( this );
GameObject.Destroy();
}
}
}