updated transition system to be more intuitive
This commit is contained in:
@@ -1,48 +0,0 @@
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace RhythmBullet.Zer01HD.Utilities.UI.ScreenSystem
|
||||
{
|
||||
public interface ITransition
|
||||
{
|
||||
/// <summary>
|
||||
/// Called once when the transition is needed.
|
||||
/// <param name="Dimensions">The dimensions of the screen.</param>
|
||||
/// </summary>
|
||||
void InitiateTransition(Rectangle dimensions);
|
||||
|
||||
/// <summary>
|
||||
/// Called every frame if the state of the screen this transition is placed upon is in the enter transition phase.
|
||||
/// </summary>
|
||||
/// <param name="delta">The time passed in seconds since the last frame.</param>
|
||||
/// <param name="assetsLoaded">Whether or not if all assets have been loaded by the <see cref="ContentSystem"/>.</param>
|
||||
/// <param name="previousScreenExitFrame">The frame being rendered by the screen as it exits. This can be null.</param>
|
||||
/// <returns>If this returns true, then it is considered that this transition is complete.</returns>
|
||||
bool EnteringTransition(double delta, bool assetsLoaded);
|
||||
|
||||
/// <summary>
|
||||
/// Called every frame if the state of the screen this transition is placed upon is in the exit phase.
|
||||
/// </summary>
|
||||
/// <param name="delta">The time passed in seconds since the last frame.</param>
|
||||
/// <param name="assetsLoaded">Whether or not if all assets have been loaded by the <see cref="ContentSystem"/>.</param>
|
||||
/// <returns>If this returns true, then it is considered that this transition is complete.</returns>
|
||||
bool ExitingTransition(double delta, bool assetsLoaded);
|
||||
|
||||
/// <summary>
|
||||
/// Called once every frame while transition is active. Meant to draw transition.
|
||||
/// </summary>
|
||||
/// <param name="spriteBatch"></param>
|
||||
void DrawTransition(SpriteBatch spriteBatch);
|
||||
|
||||
/// <summary>
|
||||
/// Updates if the previous screen uses a render target for exit transition.
|
||||
/// </summary>
|
||||
/// <param name="previousScreenFrame">The frame of the previous screen.</param>
|
||||
void UpdatePreviousScreenFrame(RenderTarget2D previousScreenFrame);
|
||||
}
|
||||
}
|
@@ -1,119 +0,0 @@
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using System;
|
||||
|
||||
namespace RhythmBullet.Zer01HD.Utilities.UI.ScreenSystem
|
||||
{
|
||||
class LoadingScreen : Screen, ITransition
|
||||
{
|
||||
private const float ENTER_TIME = 2f;
|
||||
private const float EXIT_TIME = 1f;
|
||||
readonly Texture2D texture;
|
||||
Color color;
|
||||
Rectangle textureBounds;
|
||||
readonly float proportion;
|
||||
bool recorded;
|
||||
float rR, rG, rB;
|
||||
float progR, progG, progB;
|
||||
float progC = 254;
|
||||
float rotation;
|
||||
readonly bool rotate;
|
||||
Vector2 origin;
|
||||
|
||||
public LoadingScreen(Texture2D texture, float proportion, bool rotate = false) : base(true)
|
||||
{
|
||||
color = Color.White;
|
||||
this.texture = texture;
|
||||
this.proportion = proportion;
|
||||
this.rotate = rotate;
|
||||
Transitions.Add(this);
|
||||
}
|
||||
|
||||
void DoRotate(float deltaf)
|
||||
{
|
||||
rotation += (2f / 3f) * (float)Math.PI * deltaf;
|
||||
if (rotation >= 2 * Math.PI)
|
||||
{
|
||||
rotation = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void DrawTransition(SpriteBatch spriteBatch)
|
||||
{
|
||||
spriteBatch.Draw(texture, textureBounds, null, Color.White, rotation, origin, SpriteEffects.None, 0f);
|
||||
}
|
||||
|
||||
public void InitiateTransition(Rectangle dimensions)
|
||||
{
|
||||
textureBounds.Width = (int)(ScreenSize.Height * proportion);
|
||||
textureBounds.Height = (int)(ScreenSize.Height * proportion);
|
||||
textureBounds.X = (ScreenSize.Width) / 2;
|
||||
textureBounds.Y = (ScreenSize.Height) / 2;
|
||||
origin.X = texture.Width / 2;
|
||||
origin.Y = texture.Height / 2;
|
||||
}
|
||||
|
||||
public bool EnteringTransition(double delta, bool assetsLoaded)
|
||||
{
|
||||
float deltaf = (float)delta;
|
||||
if (rotate)
|
||||
{
|
||||
DoRotate(deltaf);
|
||||
}
|
||||
if (assetsLoaded)
|
||||
{
|
||||
if (progR < 254 || progG < 254 || progB < 254)
|
||||
{
|
||||
if (!recorded)
|
||||
{
|
||||
rR = (Color.White.R - BackgroundColor.R) / ENTER_TIME;
|
||||
rG = (Color.White.G - BackgroundColor.G) / ENTER_TIME;
|
||||
rB = (Color.White.B - BackgroundColor.B) / ENTER_TIME;
|
||||
recorded = true;
|
||||
}
|
||||
progR += rR * deltaf;
|
||||
progR = Math.Min(progR, 254);
|
||||
progG += rG * deltaf;
|
||||
progG = Math.Min(progG, 254);
|
||||
progB += rB * deltaf;
|
||||
progB = Math.Min(progB, 254);
|
||||
BackgroundColor.R = (byte)progR;
|
||||
BackgroundColor.G = (byte)progG;
|
||||
BackgroundColor.B = (byte)progB;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartExitTransition(true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ExitingTransition(double delta, bool assetsLoaded)
|
||||
{
|
||||
float deltaf = (float)delta;
|
||||
if (rotate)
|
||||
{
|
||||
DoRotate(deltaf);
|
||||
}
|
||||
if (progC > 0)
|
||||
{
|
||||
float rate = deltaf * 255 / EXIT_TIME;
|
||||
progC -= rate;
|
||||
progC = Math.Max(progC, 0);
|
||||
color.R = (byte)progC;
|
||||
color.G = (byte)progC;
|
||||
color.B = (byte)progC;
|
||||
color.A = (byte)progC;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -1,142 +0,0 @@
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace RhythmBullet.Zer01HD.Utilities.UI.ScreenSystem
|
||||
{
|
||||
public enum ScreenState { EnterTransition, ExitTransition, Normal }
|
||||
|
||||
public class Screen
|
||||
{
|
||||
public List<ITransition> Transitions;
|
||||
public bool UseRenderTargetForExitTransition;
|
||||
public Color BackgroundColor;
|
||||
public Screen(bool useEnterTransition = false)
|
||||
{
|
||||
State = useEnterTransition ? ScreenState.EnterTransition : ScreenState.Normal;
|
||||
Transitions = new List<ITransition>();
|
||||
}
|
||||
|
||||
public void Initiate(Rectangle screenSize)
|
||||
{
|
||||
Initiated = true;
|
||||
this.ScreenSize = screenSize;
|
||||
foreach (ITransition transition in Transitions)
|
||||
{
|
||||
transition.InitiateTransition(screenSize);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void Update(GameTime gameTime)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public virtual void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
foreach (ITransition transition in Transitions)
|
||||
{
|
||||
transition.DrawTransition(spriteBatch);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the transition.
|
||||
/// </summary>
|
||||
/// <param name="delta">Time passed since last frame in seconds.</param>
|
||||
/// <param name="assetsLoaded">If waiting on assets.</param>
|
||||
/// <param name="previousScreenExitFrame">The previous screen's frame. May be null.</param>
|
||||
/// <returns>Only returns true if exit transition is complete. Returns false otherwise.</returns>
|
||||
public bool UpdateTransition(double delta, bool assetsLoaded)
|
||||
{
|
||||
switch (State)
|
||||
{
|
||||
case ScreenState.EnterTransition:
|
||||
EnteringTransition(delta, assetsLoaded);
|
||||
break;
|
||||
case ScreenState.ExitTransition:
|
||||
return ExitingTransition(delta, assetsLoaded);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void EnteringTransition(double delta, bool assetsLoaded)
|
||||
{
|
||||
bool complete = true;
|
||||
for (int transitionID = 0; transitionID < Transitions.Count; transitionID++)
|
||||
{
|
||||
ITransition transition = Transitions[transitionID];
|
||||
if (!transition.EnteringTransition(delta, assetsLoaded))
|
||||
{
|
||||
complete = false;
|
||||
}
|
||||
}
|
||||
if (complete && State != ScreenState.ExitTransition)
|
||||
{
|
||||
State = ScreenState.Normal;
|
||||
}
|
||||
}
|
||||
|
||||
private bool ExitingTransition(double delta, bool assetsLoaded)
|
||||
{
|
||||
bool complete = true;
|
||||
foreach (ITransition transition in Transitions)
|
||||
{
|
||||
if (!transition.ExitingTransition(delta, assetsLoaded))
|
||||
{
|
||||
complete = false;
|
||||
}
|
||||
|
||||
}
|
||||
return complete;
|
||||
}
|
||||
|
||||
public virtual void Show()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public virtual void Hide()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public virtual void AssetLoadStateChange(bool state)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ScreenState State { get; private set; }
|
||||
|
||||
public void StartExitTransition(bool UseRenderTargetForExitTransition = false)
|
||||
{
|
||||
this.UseRenderTargetForExitTransition = UseRenderTargetForExitTransition;
|
||||
State = ScreenState.ExitTransition;
|
||||
}
|
||||
|
||||
public virtual void UpdatePreviousScreenFrame(RenderTarget2D previousScreenFrame)
|
||||
{
|
||||
foreach (ITransition transition in Transitions)
|
||||
{
|
||||
transition.UpdatePreviousScreenFrame(previousScreenFrame);
|
||||
}
|
||||
}
|
||||
|
||||
public Screen NextScreen
|
||||
{ get; protected set; }
|
||||
|
||||
public Rectangle ScreenSize
|
||||
{ get; protected set; }
|
||||
|
||||
public bool Initiated
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user