gmtk-gj-2020/Entities/DownloadEntity.cs
2020-07-12 12:05:52 -05:00

112 lines
3.6 KiB
C#

using System.Drawing;
using SkinnerBox.Utilities;
using SlatedGameToolkit.Framework.Graphics.Render;
using SlatedGameToolkit.Framework.Graphics.Textures;
using SlatedGameToolkit.Framework.Utilities.Collections.Pooling;
namespace SkinnerBox.Entities
{
public class DownloadEntity : Entity, IPoolable
{
private readonly float unitSize = 1/2f;
private readonly float unitPerProgressTexture = 0.4f;
public float stepSize;
public TransitionValue progressValue;
public RectangleMesh progressMesh;
public TransitionValue timeElapsed;
public float upTime;
int size;
public int Size {
get {
return size;
}
set {
this.size = value;
mesh.TextureBounds = new RectangleF(0, 0, size, 1f);
Width = unitSize * size;
}
}
public override RectangleF HitBox {
get {
RectangleF rect = base.HitBox;
rect.Width = Width + 0.5f;
return rect;
}
}
public DownloadEntity(ITexture promptTex, ITexture progressTex) : base(promptTex)
{
Size = 1;
Height = unitSize;
progressMesh = new RectangleMesh(progressTex, Color.White);
Reset();
}
private void UpdateProgressMesh() {
progressMesh.Width = progressValue.Value;
progressMesh.TextureBounds = new RectangleF(0, 0, progressValue.Value * unitPerProgressTexture, 1f);
progressMesh.Height = Height;
progressMesh.X = X;
progressMesh.Y = Y;
}
public void Reset()
{
Size = 1;
progressValue.HardSet(0.1f);
timeElapsed.HardSet(0);
stepSize = 0;
upTime = 0;
Color = Color.Black;
UpdateProgressMesh();
}
public void Input(float x) {
if (x <= progressValue.DesignatedValue + (1f/stepSize) && x > progressValue.DesignatedValue) {
progressValue.Value = x;
if (progressValue.Value > Width) progressValue.HardSet(Width);
}
}
public override void InterpolatePosition(float delta) {
progressValue.InterpolatePosition(delta);
timeElapsed.InterpolatePosition(delta);
float prog = timeElapsed.Value / upTime;
if (upTime != 0) {
if (prog > 1) {
prog = 1;
} else if (prog < 0) {
prog = 0;
}
} else {
prog = 1;
}
this.Color = Color.FromArgb((int)(byte.MaxValue * (1f - prog)), Color);
progressMesh.Color = Color.FromArgb((int)(byte.MaxValue * (1f - prog)), progressMesh.Color);
UpdateProgressMesh();
base.InterpolatePosition(delta);
}
}
public struct DownloadSpawnInfo
{
public float period;
public float elapsedSinceSpawn;
public float upTime;
public float stepSize;
public int maximumAmount;
public int generalSize;
public int sizeRange;
public DownloadSpawnInfo(float cooldown, float health, float stepSize, int maxAmount, int generalSize, int sizeRange)
{
this.period = cooldown;
this.elapsedSinceSpawn = 0;
this.upTime = health;
this.stepSize = stepSize;
this.maximumAmount = maxAmount;
this.sizeRange = sizeRange;
this.generalSize = generalSize;
}
}
}