improved transition system with usage of target rendering
This commit is contained in:
parent
44b2c74ff5
commit
042fba4249
@ -62,13 +62,17 @@ namespace RhythmBullet
|
|||||||
{
|
{
|
||||||
if (currentScreen != null)
|
if (currentScreen != null)
|
||||||
{
|
{
|
||||||
previousScreen = value;
|
if (value.GetType() != typeof(MainScreen))
|
||||||
|
{
|
||||||
|
previousScreen = value;
|
||||||
|
}
|
||||||
Screen.Hide();
|
Screen.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
currentScreen = value;
|
currentScreen = value;
|
||||||
currentScreen.ScreenSize.Width = graphics.PreferredBackBufferWidth;
|
if (!Screen.Initiated)
|
||||||
currentScreen.ScreenSize.Height = graphics.PreferredBackBufferHeight;
|
{
|
||||||
|
Screen.Initiate(new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), graphics.GraphicsDevice);
|
||||||
|
}
|
||||||
Screen.Show();
|
Screen.Show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -128,12 +132,26 @@ namespace RhythmBullet
|
|||||||
switch (Screen.State)
|
switch (Screen.State)
|
||||||
{
|
{
|
||||||
case ScreenState.EnterTransition:
|
case ScreenState.EnterTransition:
|
||||||
Screen.EnteringTransition(gameTime.ElapsedGameTime.TotalSeconds, Assets.Done, ref BackgroundColor);
|
if (previousScreen != null && previousScreen.UseRenderTargetForExitTransition)
|
||||||
|
{
|
||||||
|
graphics.GraphicsDevice.SetRenderTarget(previousScreen.RenderTarget);
|
||||||
|
previousScreen.ExitingTransition(gameTime.ElapsedGameTime.TotalSeconds, Assets.Done, ref BackgroundColor);
|
||||||
|
previousScreen.Draw(spriteBatch);
|
||||||
|
graphics.GraphicsDevice.SetRenderTarget(null);
|
||||||
|
}
|
||||||
|
Screen.EnteringTransition(gameTime.ElapsedGameTime.TotalSeconds, Assets.Done, ref BackgroundColor, previousScreen?.RenderTarget);
|
||||||
break;
|
break;
|
||||||
case ScreenState.ExitTransition:
|
case ScreenState.ExitTransition:
|
||||||
if (Screen.ExitingTransition(gameTime.ElapsedGameTime.TotalSeconds, Assets.Done, ref BackgroundColor))
|
if (Screen.UseRenderTargetForExitTransition || Screen.ExitingTransition(gameTime.ElapsedGameTime.TotalSeconds, Assets.Done, ref BackgroundColor))
|
||||||
{
|
{
|
||||||
Screen = previousScreen != null ? previousScreen : new MainScreen(graphics.GraphicsDevice, BackgroundColor, Assets);
|
if (Screen.NextScreen != null)
|
||||||
|
{
|
||||||
|
Screen = Screen.NextScreen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Screen = previousScreen != null ? previousScreen : new MainScreen(graphics.GraphicsDevice, BackgroundColor, Assets);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ScreenState.Normal:
|
case ScreenState.Normal:
|
||||||
|
@ -36,10 +36,10 @@ namespace RhythmBullet.Zer01HD.Game.Screens
|
|||||||
base.Draw(spriteBatch);
|
base.Draw(spriteBatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void EnteringTransition(double delta, bool assetsLoaded, ref Color backgroundColor)
|
public override void EnteringTransition(double delta, bool assetsLoaded, ref Color backgroundColor, RenderTarget2D previousScreenExitFrame)
|
||||||
{
|
{
|
||||||
fadeInTransition.Fade((float)delta);
|
fadeInTransition.Fade((float)delta);
|
||||||
base.EnteringTransition(delta, assetsLoaded, ref backgroundColor);
|
base.EnteringTransition(delta, assetsLoaded, ref backgroundColor, previousScreenExitFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ namespace RhythmBullet.Zer01HD.Game
|
|||||||
base.Update(gameTime);
|
base.Update(gameTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void EnteringTransition(double delta, bool assetsLoaded, ref Color BGColor)
|
public override void EnteringTransition(double delta, bool assetsLoaded, ref Color BGColor, RenderTarget2D previousScreenExitFrame)
|
||||||
{
|
{
|
||||||
float deltaf = (float)delta;
|
float deltaf = (float)delta;
|
||||||
if (rotate)
|
if (rotate)
|
||||||
@ -73,7 +73,7 @@ namespace RhythmBullet.Zer01HD.Game
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
DoneEnterTransition();
|
DoneEnterTransition();
|
||||||
StartExitTransition();
|
StartExitTransition(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,13 +12,19 @@ namespace RhythmBullet.Zer01HD.Utilities.UI
|
|||||||
|
|
||||||
public class Screen
|
public class Screen
|
||||||
{
|
{
|
||||||
public Rectangle ScreenSize;
|
public bool UseRenderTargetForExitTransition;
|
||||||
|
private GraphicsDevice GraphicsDevice;
|
||||||
ScreenState state;
|
|
||||||
|
|
||||||
public Screen(bool useEnterTransition = false)
|
public Screen(bool useEnterTransition = false)
|
||||||
{
|
{
|
||||||
state = useEnterTransition ? ScreenState.EnterTransition : ScreenState.Normal;
|
State = useEnterTransition ? ScreenState.EnterTransition : ScreenState.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initiate(Rectangle screenSize, GraphicsDevice graphicsDevice)
|
||||||
|
{
|
||||||
|
Initiated = true;
|
||||||
|
this.ScreenSize = screenSize;
|
||||||
|
this.GraphicsDevice = graphicsDevice;
|
||||||
|
RenderTarget = new RenderTarget2D(graphicsDevice, ScreenSize.Width, ScreenSize.Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Update(GameTime gameTime)
|
public virtual void Update(GameTime gameTime)
|
||||||
@ -31,7 +37,7 @@ namespace RhythmBullet.Zer01HD.Utilities.UI
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void EnteringTransition(double delta, bool assetsLoaded, ref Color backgroundColor)
|
public virtual void EnteringTransition(double delta, bool assetsLoaded, ref Color backgroundColor, RenderTarget2D previousScreenExitFrame)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -56,23 +62,41 @@ namespace RhythmBullet.Zer01HD.Utilities.UI
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScreenState State
|
public ScreenState State { get; private set; }
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DoneEnterTransition()
|
public void DoneEnterTransition()
|
||||||
{
|
{
|
||||||
state = ScreenState.Normal;
|
State = ScreenState.Normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartExitTransition()
|
public void StartExitTransition(bool UseRenderTargetForExitTransition = false)
|
||||||
{
|
{
|
||||||
state = ScreenState.ExitTransition;
|
this.UseRenderTargetForExitTransition = UseRenderTargetForExitTransition;
|
||||||
|
State = ScreenState.ExitTransition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Screen NextScreen
|
||||||
|
{
|
||||||
|
get; protected set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Rectangle ScreenSize
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
protected set;
|
||||||
|
//Remember to init in init func
|
||||||
|
}
|
||||||
|
|
||||||
|
public RenderTarget2D RenderTarget
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Initiated
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
private set;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user