93 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |