// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Audio.Sample; using osu.Framework.Audio.Track; using osu.Framework.Configuration; using osu.Framework.MathUtils; using osu.Framework.Screens; using osu.Framework.Graphics; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Database; using osu.Game.Graphics.Containers; using osu.Game.Screens.Backgrounds; using OpenTK.Graphics; namespace osu.Game.Screens.Menu { public class Intro : OsuScreen { private readonly OsuLogo logo; /// /// Whether we have loaded the menu previously. /// internal bool DidLoadMenu; private MainMenu mainMenu; private SampleChannel welcome; private SampleChannel seeya; private Track bgm; internal override bool HasLocalCursorDisplayed => true; internal override bool ShowOverlays => false; protected override BackgroundScreen CreateBackground() => new BackgroundScreenEmpty(); public Intro() { Children = new Drawable[] { new ParallaxContainer { ParallaxAmount = 0.01f, Children = new Drawable[] { logo = new OsuLogo { Alpha = 0, Triangles = false, BlendingMode = BlendingMode.Additive, Interactive = false, Colour = Color4.DarkGray, Ripple = false } } } }; } private Bindable menuVoice; private Bindable menuMusic; private TrackManager trackManager; private BeatmapInfo beatmap; private WorkingBeatmap song; [BackgroundDependencyLoader] private void load(OsuGameBase game, AudioManager audio, OsuConfigManager config, BeatmapDatabase beatmaps) { menuVoice = config.GetBindable(OsuConfig.MenuVoice); menuMusic = config.GetBindable(OsuConfig.MenuMusic); if (!menuMusic) { trackManager = game.Audio.Track; beatmap = beatmaps.GetWithChildren(RNG.Next(beatmaps.Query().Count() - 1)).Beatmaps[0]; song = beatmaps.GetWorkingBeatmap(beatmap); Beatmap = song; } bgm = audio.Track.Get(@"circles"); bgm.Looping = true; welcome = audio.Sample.Get(@"welcome"); seeya = audio.Sample.Get(@"seeya"); } protected override void OnEntering(Screen last) { base.OnEntering(last); if(menuVoice) welcome.Play(); Scheduler.AddDelayed(delegate { if(menuMusic) bgm.Start(); else { Task.Run(() => { trackManager.SetExclusive(song.Track); song.Track.Seek(beatmap.Metadata.PreviewTime); if (beatmap.Metadata.PreviewTime == -1) song.Track.Seek(song.Track.Length * .4f); }); } LoadComponentAsync(mainMenu = new MainMenu()); Scheduler.AddDelayed(delegate { if (!menuMusic) Task.Run(() => song.Track.Start()); DidLoadMenu = true; Push(mainMenu); }, 2300); }, 600); logo.ScaleTo(0.4f); logo.FadeOut(); logo.ScaleTo(1, 4400, EasingTypes.OutQuint); logo.FadeIn(20000, EasingTypes.OutQuint); } protected override void OnSuspending(Screen next) { Content.FadeOut(300); base.OnSuspending(next); } protected override bool OnExiting(Screen next) { //cancel exiting if we haven't loaded the menu yet. return !DidLoadMenu; } protected override void OnResuming(Screen last) { if (!(last is MainMenu)) Content.FadeIn(300); double fadeOutTime = 2000; //we also handle the exit transition. if (menuVoice) seeya.Play(); else fadeOutTime = 500; Scheduler.AddDelayed(Exit, fadeOutTime); //don't want to fade out completely else we will stop running updates and shit will hit the fan. Game.FadeTo(0.01f, fadeOutTime); base.OnResuming(last); } } }