// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Primitives; using osu.Framework.Graphics.Sprites; using osu.Framework.Screens; using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Screens.Backgrounds; using osu.Game.Screens.Menu; using OpenTK; namespace osu.Game.Screens.Play { public class PlayerLoader : OsuScreen { private Player player; private readonly OsuLogo logo; private BeatmapMetadataDisplay info; private bool showOverlays = true; internal override bool ShowOverlays => showOverlays; protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap); public PlayerLoader(Player player) { ValidForResume = false; player.OnRestart = restart; this.player = player; Children = new Drawable[] { logo = new OsuLogo { Scale = new Vector2(0.15f), Interactive = false, }, }; } [BackgroundDependencyLoader] private void load() { Add(info = new BeatmapMetadataDisplay(Beatmap) { Alpha = 0, Anchor = Anchor.Centre, Origin = Anchor.Centre, }); LoadComponentAsync(player); } protected override void OnResuming(Screen last) { base.OnResuming(last); if (last != player) return; var newPlayer = new Player { RestartCount = player.RestartCount + 1, OnRestart = restart }; player = newPlayer; LoadComponentAsync(newPlayer, delegate { if (!Push(newPlayer)) Exit(); ValidForResume = false; }); } private void restart() { showOverlays = false; ValidForResume = true; } protected override void OnEntering(Screen last) { base.OnEntering(last); Background.FadeTo(0.4f, 250); Content.ScaleTo(0.7f); Content.ScaleTo(1, 750, EasingTypes.OutQuint); Content.FadeInFromZero(500); Delay(1000, true); logo.MoveToOffset(new Vector2(0, -180), 500, EasingTypes.InOutExpo); Delay(250, true); info.FadeIn(500); Delay(2000, true); Content.ScaleTo(0.7f, 300, EasingTypes.InQuint); Content.FadeOut(250); Delay(250); Schedule(() => { if (!IsCurrentScreen) return; if (!Push(player)) Exit(); }); } protected override bool OnExiting(Screen next) { Content.ScaleTo(0.7f, 150, EasingTypes.InQuint); FadeOut(150); return base.OnExiting(next); } private class BeatmapMetadataDisplay : Container { private class MetadataLine : Container { public MetadataLine(string left, string right) { AutoSizeAxes = Axes.Both; Children = new Drawable[] { new OsuSpriteText { Anchor = Anchor.TopCentre, Origin = Anchor.TopRight, Margin = new MarginPadding { Right = 5 }, Colour = OsuColour.Gray(0.5f), Text = left, }, new OsuSpriteText { Anchor = Anchor.TopCentre, Origin = Anchor.TopLeft, Margin = new MarginPadding { Left = 5 }, Text = string.IsNullOrEmpty(right) ? @"-" : right, } }; } } public BeatmapMetadataDisplay(WorkingBeatmap beatmap) { var metadata = beatmap?.BeatmapInfo?.Metadata ?? new BeatmapMetadata(); AutoSizeAxes = Axes.Both; Children = new Drawable[] { new FillFlowContainer { AutoSizeAxes = Axes.Both, Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, Direction = FillDirection.Vertical, Children = new Drawable[] { new OsuSpriteText { Text = metadata.Title, TextSize = 36, Font = @"Exo2.0-MediumItalic", Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, }, new OsuSpriteText { Text = metadata.Artist, TextSize = 26, Font = @"Exo2.0-MediumItalic", Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, }, new Container { Size = new Vector2(300, 60), Margin = new MarginPadding(10), Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, CornerRadius = 10, Masking = true, Children = new[] { new Sprite { Texture = beatmap?.Background, Origin = Anchor.Centre, Anchor = Anchor.Centre, FillMode = FillMode.Fill, }, } }, new OsuSpriteText { Text = beatmap?.BeatmapInfo?.Version, TextSize = 26, Font = @"Exo2.0-MediumItalic", Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, Margin = new MarginPadding { Bottom = 40 }, }, new MetadataLine("Source", metadata.Source) { Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, }, new MetadataLine("Composer", string.Empty) { Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, }, new MetadataLine("Mapper", metadata.Author) { Origin = Anchor.TopCentre, Anchor = Anchor.TopCentre, }, }, } }; } } } }