experiments-monogame/Lighthouse/Lighthouse/Components/TimeOfDayRenderer.cs
2024-12-16 21:27:11 -06:00

93 lines
3.2 KiB
C#

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Nez;
using Random = Nez.Random;
namespace Lighthouse
{
public class TimeOfDayRenderer : RenderableComponent, IUpdatable
{
public override float Width => 640;
public override float Height => 360;
private Texture2D _rect;
private readonly World _world;
private float _lastWeatherUpdate;
private float[,] _rainParams;
private float _windDirection;
public TimeOfDayRenderer(World world)
{
_world = world;
LayerDepth = 0.3f;
_rainParams = new float[50, 3];
_windDirection = 0;
}
public override void OnAddedToEntity()
{
_rect = Graphics.CreateSingleColorTexture(1, 1, Color.White);
}
public void Update()
{
if (Time.TotalTime - _lastWeatherUpdate < 0.1)
return;
_lastWeatherUpdate = Time.TotalTime;
_windDirection += (Random.NextFloat() - 0.5f);
for (int i = 0; i < _rainParams.GetLength(0); ++i)
{
_rainParams[i, 0] = Random.NextFloat() * Entity.Scene.Camera.Bounds.Width;
_rainParams[i, 1] = Random.NextFloat() * Entity.Scene.Camera.Bounds.Height;
switch (_world.Weather)
{
case WeatherType.Rain:
_rainParams[i, 2] = 5 + Random.NextFloat() * 20;
break;
case WeatherType.Snow:
_rainParams[i, 2] = Random.NextFloat() * 4;
break;
}
}
}
public override void Render(Batcher batcher, Camera camera)
{
var brightness = Math.Sin((_world.DayTime + (24-World.Sunrise)) * Math.PI / 12);
var percent = (float) (brightness < 0 ? 0.9f : Math.Max(0.9 - brightness, 0));
batcher.Draw(_rect, new Rectangle(0, 0, 640, 360), new Color(0, 0, 0, percent));
Color _rainColor = new Color(0, 0, 128, 128);
switch (_world.Weather)
{
case WeatherType.Rain:
for (int i = 0; i < _rainParams.GetLength(0); ++i)
{
batcher.DrawLine(
_rainParams[i, 0],
_rainParams[i, 1],
_rainParams[i, 0] + _windDirection,
_rainParams[i, 1] + _rainParams[i, 2],
_rainColor
);
}
break;
case WeatherType.Snow:
for (int i = 0; i < _rainParams.GetLength(0); ++i)
{
batcher.DrawCircle(
_rainParams[i, 0],
_rainParams[i, 1],
_rainParams[i, 2],
Color.White
);
}
break;
default:
break;
}
}
}
}