mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 16:06:06 +08:00
66 lines
2.0 KiB
C#
66 lines
2.0 KiB
C#
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
// See the LICENCE file in the repository root for full licence text.
|
|
|
|
#nullable disable
|
|
|
|
using osu.Framework.Allocation;
|
|
using osu.Framework.Graphics;
|
|
using osu.Framework.Screens;
|
|
using osu.Game.Graphics.Containers;
|
|
|
|
namespace osu.Game.Screens
|
|
{
|
|
public class OsuScreenStack : ScreenStack
|
|
{
|
|
[Cached]
|
|
private BackgroundScreenStack backgroundScreenStack;
|
|
|
|
private readonly ParallaxContainer parallaxContainer;
|
|
|
|
protected float ParallaxAmount => parallaxContainer.ParallaxAmount;
|
|
|
|
public OsuScreenStack()
|
|
{
|
|
InternalChild = parallaxContainer = new ParallaxContainer
|
|
{
|
|
RelativeSizeAxes = Axes.Both,
|
|
Child = backgroundScreenStack = new BackgroundScreenStack { RelativeSizeAxes = Axes.Both },
|
|
};
|
|
|
|
ScreenPushed += screenPushed;
|
|
ScreenExited += ScreenChanged;
|
|
}
|
|
|
|
public void PushSynchronously(OsuScreen screen)
|
|
{
|
|
LoadComponent(screen);
|
|
|
|
Push(screen);
|
|
}
|
|
|
|
private void screenPushed(IScreen prev, IScreen next)
|
|
{
|
|
if (LoadState < LoadState.Ready)
|
|
{
|
|
// dependencies must be present to stay in a sane state.
|
|
// this is generally only ever hit by test scenes.
|
|
Schedule(() => screenPushed(prev, next));
|
|
return;
|
|
}
|
|
|
|
// create dependencies synchronously to ensure leases are in a sane state.
|
|
((OsuScreen)next).CreateLeasedDependencies((prev as OsuScreen)?.Dependencies ?? Dependencies);
|
|
|
|
ScreenChanged(prev, next);
|
|
}
|
|
|
|
protected virtual void ScreenChanged(IScreen prev, IScreen next)
|
|
{
|
|
setParallax(next);
|
|
}
|
|
|
|
private void setParallax(IScreen next) =>
|
|
parallaxContainer.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * (((IOsuScreen)next)?.BackgroundParallaxAmount ?? 1.0f);
|
|
}
|
|
}
|