using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using RhythmBullet.Zer01HD.Utilities.UI; using RhythmBullet.Zer01HD.Utilities.ScreenSystem; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RhythmBullet.Zer01HD.Screens.Transitions { internal class FadeAwayTransition : IDisposable, ITransition { private float time; public Texture2D curtain; public Rectangle curtainSize; private Color color; private float progR, progG, progB, progA; private float rR, rG, rB, rA; internal FadeAwayTransition(float time) { this.time = time; } public void InitiateTransition(Rectangle dimensions) { curtainSize = dimensions; color = Color.White; rR = (0 - 254) / time; rG = (0 - 254) / time; rB = (0 - 254) / time; rA = (0 - 254) / time; progA = color.A; progR = color.R; progG = color.G; progB = color.B; } private bool Fade(float deltaf) { if (progR > 0 || progG > 0 || progB > 0) { progR += rR * deltaf; progR = Math.Max(progR, 0); progG += rG * deltaf; progG = Math.Max(progG, 0); progB += rB * deltaf; progB = Math.Max(progB, 0); progA += rA * deltaf; progA = Math.Max(progA, 0); color.R = (byte)progR; color.G = (byte)progG; color.B = (byte)progB; color.A = (byte)progA; return false; } return true; } public void DrawTransition(SpriteBatch batch) { if (curtain != null) { batch.Draw(curtain, curtainSize, color); } } public void Dispose() { curtain.Dispose(); } public bool EnteringTransition(double delta, bool assetsLoaded) { return Fade((float)delta); } public bool ExitingTransition(double delta, bool assetsLoaded) { return Fade((float)delta); } public void UpdatePreviousScreenFrame(RenderTarget2D previousScreenFrame) { curtain = previousScreenFrame; } } }