From b48bb5b7923d82919c40cdce43e5fb599fda4618 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 31 Jan 2019 18:10:21 +0900 Subject: [PATCH] Move parallax logic out of BackgroundScreenStack --- osu.Game/OsuGame.cs | 11 +++++- osu.Game/Screens/BackgroundScreenStack.cs | 34 ++++--------------- osu.Game/Screens/IOsuScreen.cs | 5 +++ osu.Game/Screens/Multi/Multiplayer.cs | 2 ++ .../Screens/Multi/MultiplayerSubScreen.cs | 2 ++ osu.Game/Screens/OsuScreen.cs | 8 ++--- 6 files changed, 29 insertions(+), 33 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 0a659cc26e..b820ca89ee 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -86,6 +86,9 @@ namespace osu.Game public readonly Bindable OverlayActivationMode = new Bindable(); private BackgroundScreenStack backgroundStack; + + private ParallaxContainer backgroundParallax; + private ScreenStack screenStack; private VolumeOverlay volume; private OnScreenDisplay onscreenDisplay; @@ -353,7 +356,11 @@ namespace osu.Game ActionRequested = action => volume.Adjust(action), ScrollActionRequested = (action, amount, isPrecise) => volume.Adjust(action, amount, isPrecise), }, - backgroundStack = new BackgroundScreenStack { RelativeSizeAxes = Axes.Both }, + backgroundParallax = new ParallaxContainer + { + RelativeSizeAxes = Axes.Both, + Child = backgroundStack = new BackgroundScreenStack { RelativeSizeAxes = Axes.Both }, + }, screenContainer = new ScalingContainer(ScalingMode.ExcludeOverlays) { RelativeSizeAxes = Axes.Both, @@ -766,6 +773,8 @@ namespace osu.Game if (newScreen is IOsuScreen newOsuScreen) { + backgroundParallax.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * newOsuScreen.BackgroundParallaxAmount; + OverlayActivationMode.Value = newOsuScreen.InitialOverlayActivationMode; if (newOsuScreen.HideOverlaysOnEnter) diff --git a/osu.Game/Screens/BackgroundScreenStack.cs b/osu.Game/Screens/BackgroundScreenStack.cs index 6e218d051a..7bf167295c 100644 --- a/osu.Game/Screens/BackgroundScreenStack.cs +++ b/osu.Game/Screens/BackgroundScreenStack.cs @@ -3,50 +3,30 @@ using System.Collections.Generic; using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; using osu.Framework.Screens; -using osu.Game.Graphics.Containers; using osuTK; namespace osu.Game.Screens { - public class BackgroundScreenStack : CompositeDrawable + public class BackgroundScreenStack : ScreenStack { - public BackgroundScreen Current => (BackgroundScreen)stack.CurrentScreen; - - private readonly ParallaxContainer parallax; - private readonly ScreenStack stack; - public BackgroundScreenStack() { - InternalChild = parallax = new ParallaxContainer - { - RelativeSizeAxes = Axes.Both, - Child = stack = new ScreenStack - { - RelativeSizeAxes = Axes.Both, - Scale = new Vector2(1.06f) - } - }; + Scale = new Vector2(1.06f); + RelativeSizeAxes = Axes.Both; } - public float ParallaxAmount { set => parallax.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * value; } + //public float ParallaxAmount { set => parallax.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * value; } - public void Push(BackgroundScreen screen) + public new void Push(BackgroundScreen screen) { if (screen == null) return; - if (EqualityComparer.Default.Equals(Current, screen)) + if (EqualityComparer.Default.Equals((BackgroundScreen)CurrentScreen, screen)) return; - stack.Push(screen); - } - - public void Exit(BackgroundScreen screen) - { - if (stack.CurrentScreen == screen) - stack.Exit(); + base.Push(screen); } } } diff --git a/osu.Game/Screens/IOsuScreen.cs b/osu.Game/Screens/IOsuScreen.cs index 46e42f2e80..532d4963a0 100644 --- a/osu.Game/Screens/IOsuScreen.cs +++ b/osu.Game/Screens/IOsuScreen.cs @@ -30,5 +30,10 @@ namespace osu.Game.Screens /// Whether overlays should be able to be opened once this screen is entered or resumed. /// OverlayActivation InitialOverlayActivationMode { get; } + + /// + /// The amount of parallax to be applied while this screen is displayed. + /// + float BackgroundParallaxAmount { get; } } } diff --git a/osu.Game/Screens/Multi/Multiplayer.cs b/osu.Game/Screens/Multi/Multiplayer.cs index 6ad205d8a6..1741ac0b7b 100644 --- a/osu.Game/Screens/Multi/Multiplayer.cs +++ b/osu.Game/Screens/Multi/Multiplayer.cs @@ -35,6 +35,8 @@ namespace osu.Game.Screens.Multi public bool HideOverlaysOnEnter => false; public OverlayActivation InitialOverlayActivationMode => OverlayActivation.All; + public float BackgroundParallaxAmount => 1; + public bool ValidForResume { get; set; } = true; public bool ValidForPush { get; set; } = true; diff --git a/osu.Game/Screens/Multi/MultiplayerSubScreen.cs b/osu.Game/Screens/Multi/MultiplayerSubScreen.cs index 3ea1de890a..ddea4d5dad 100644 --- a/osu.Game/Screens/Multi/MultiplayerSubScreen.cs +++ b/osu.Game/Screens/Multi/MultiplayerSubScreen.cs @@ -22,6 +22,8 @@ namespace osu.Game.Screens.Multi public bool HideOverlaysOnEnter => false; public OverlayActivation InitialOverlayActivationMode => OverlayActivation.All; + public float BackgroundParallaxAmount => 1; + public bool ValidForResume { get; set; } = true; public bool ValidForPush { get; set; } = true; diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs index 34295d512e..dcab9faed9 100644 --- a/osu.Game/Screens/OsuScreen.cs +++ b/osu.Game/Screens/OsuScreen.cs @@ -60,7 +60,7 @@ namespace osu.Game.Screens private SampleChannel sampleExit; - protected BackgroundScreen Background => backgroundStack?.Current; + protected BackgroundScreen Background => backgroundStack?.CurrentScreen as BackgroundScreen; private BackgroundScreen localBackground; @@ -137,7 +137,8 @@ namespace osu.Game.Screens if (base.OnExiting(next)) return true; - backgroundStack?.Exit(localBackground); + if (localBackground != null && backgroundStack?.CurrentScreen == localBackground) + backgroundStack?.Exit(); Beatmap.UnbindAll(); return false; @@ -157,9 +158,6 @@ namespace osu.Game.Screens { if (this.IsCurrentScreen()) LogoArriving(logo, isResuming); }, true); - - if (backgroundStack != null) - backgroundStack.ParallaxAmount = BackgroundParallaxAmount; } ///