1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-18 23:32:54 +08:00
osu-lazer/osu.Game/Screens/Play/PlayerLoader.cs

265 lines
9.4 KiB
C#
Raw Normal View History

2018-01-05 19:21:19 +08:00
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
2017-02-22 20:43:29 +08:00
// 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.Sprites;
using osu.Framework.Screens;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Screens.Backgrounds;
using OpenTK;
2017-04-29 02:05:00 +08:00
using osu.Framework.Localisation;
using osu.Game.Screens.Menu;
2017-02-22 20:43:29 +08:00
namespace osu.Game.Screens.Play
{
public class PlayerLoader : OsuScreen
{
private Player player;
2017-02-22 20:43:29 +08:00
private BeatmapMetadataDisplay info;
2017-04-18 14:36:11 +08:00
private bool showOverlays = true;
public override bool ShowOverlaysOnEnter => showOverlays;
public override bool AllowBeatmapRulesetChange => false;
2017-02-22 20:43:29 +08:00
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap);
public PlayerLoader(Player player)
{
this.player = player;
2017-07-19 12:32:16 +08:00
player.RestartRequested = () =>
{
showOverlays = false;
ValidForResume = true;
};
2017-02-22 20:43:29 +08:00
}
[BackgroundDependencyLoader]
private void load()
{
Add(info = new BeatmapMetadataDisplay(Beatmap)
{
Alpha = 0,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
});
2017-04-02 14:56:12 +08:00
LoadComponentAsync(player);
2017-02-22 20:43:29 +08:00
}
protected override void OnResuming(Screen last)
{
base.OnResuming(last);
contentIn();
//we will only be resumed if the player has requested a re-run (see ValidForResume setting above)
LoadComponentAsync(player = new Player
{
RestartCount = player.RestartCount + 1,
RestartRequested = player.RestartRequested,
});
this.Delay(400).Schedule(pushWhenLoaded);
}
private void contentIn()
{
2017-07-23 02:50:25 +08:00
Content.ScaleTo(1, 650, Easing.OutQuint);
Content.FadeInFromZero(400);
}
private void contentOut()
{
2017-07-23 02:50:25 +08:00
Content.ScaleTo(0.7f, 300, Easing.InQuint);
Content.FadeOut(250);
}
2017-02-22 20:43:29 +08:00
protected override void OnEntering(Screen last)
{
base.OnEntering(last);
Background.FadeTo(0.4f, 250);
Content.ScaleTo(0.7f);
contentIn();
info.Delay(750).FadeIn(500);
this.Delay(2150).Schedule(pushWhenLoaded);
}
2017-11-09 16:38:20 +08:00
protected override void LogoArriving(OsuLogo logo, bool resuming)
{
2017-11-09 16:38:20 +08:00
base.LogoArriving(logo, resuming);
logo.RelativePositionAxes = Axes.Both;
logo.ScaleTo(new Vector2(0.15f), 300, Easing.In);
logo.MoveTo(new Vector2(0.5f), 300, Easing.In);
2017-11-02 20:52:01 +08:00
logo.FadeIn(350);
2017-11-02 20:52:01 +08:00
logo.Delay(resuming ? 0 : 500).MoveToOffset(new Vector2(0, -0.24f), 500, Easing.InOutExpo);
}
private void pushWhenLoaded()
{
2017-09-15 15:06:27 +08:00
if (player.LoadState != LoadState.Ready)
{
Schedule(pushWhenLoaded);
return;
}
contentOut();
2017-02-22 20:43:29 +08:00
this.Delay(250).Schedule(() =>
2017-02-22 20:43:29 +08:00
{
if (!IsCurrentScreen) return;
2017-02-22 20:43:29 +08:00
if (!Push(player))
Exit();
else
{
//By default, we want to load the player and never be returned to.
//Note that this may change if the player we load requested a re-run.
ValidForResume = false;
}
2017-02-22 20:43:29 +08:00
});
}
protected override bool OnExiting(Screen next)
{
2017-07-23 02:50:25 +08:00
Content.ScaleTo(0.7f, 150, Easing.InQuint);
this.FadeOut(150);
2017-02-22 20:43:29 +08:00
return base.OnExiting(next);
}
2017-03-07 09:59:19 +08:00
private class BeatmapMetadataDisplay : Container
2017-02-22 20:43:29 +08:00
{
2017-03-07 09:59:19 +08:00
private class MetadataLine : Container
2017-02-22 20:43:29 +08:00
{
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,
}
};
}
}
2017-05-01 10:38:51 +08:00
private readonly WorkingBeatmap beatmap;
2017-04-29 02:05:00 +08:00
2017-02-22 20:43:29 +08:00
public BeatmapMetadataDisplay(WorkingBeatmap beatmap)
{
2017-05-01 10:38:51 +08:00
this.beatmap = beatmap;
}
[BackgroundDependencyLoader]
private void load(LocalisationEngine localisation)
{
var metadata = beatmap?.BeatmapInfo?.Metadata ?? new BeatmapMetadata();
2017-02-27 15:37:49 +08:00
2017-02-22 20:43:29 +08:00
AutoSizeAxes = Axes.Both;
Children = new Drawable[]
{
2017-03-07 09:59:19 +08:00
new FillFlowContainer
2017-02-22 20:43:29 +08:00
{
AutoSizeAxes = Axes.Both,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
2017-03-04 18:00:17 +08:00
Direction = FillDirection.Vertical,
2017-02-22 20:43:29 +08:00
Children = new Drawable[]
{
2017-05-01 10:38:51 +08:00
new OsuSpriteText
2017-02-22 20:43:29 +08:00
{
2017-05-01 10:38:51 +08:00
Current = localisation.GetUnicodePreference(metadata.TitleUnicode, metadata.Title),
2017-02-22 20:43:29 +08:00
TextSize = 36,
Font = @"Exo2.0-MediumItalic",
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
},
2017-05-01 10:38:51 +08:00
new OsuSpriteText
2017-02-22 20:43:29 +08:00
{
2017-05-01 10:38:51 +08:00
Current = localisation.GetUnicodePreference(metadata.ArtistUnicode, metadata.Artist),
2017-02-22 20:43:29 +08:00
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
{
RelativeSizeAxes = Axes.Both,
Texture = beatmap?.Background,
2017-02-22 20:43:29 +08:00
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
FillMode = FillMode.Fill,
},
}
},
new OsuSpriteText
{
Text = beatmap?.BeatmapInfo?.Version,
2017-02-22 20:43:29 +08:00
TextSize = 26,
Font = @"Exo2.0-MediumItalic",
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
Margin = new MarginPadding
{
Bottom = 40
},
},
2017-02-27 15:37:49 +08:00
new MetadataLine("Source", metadata.Source)
2017-02-22 20:43:29 +08:00
{
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
},
new MetadataLine("Composer", string.Empty)
{
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
},
new MetadataLine("Mapper", metadata.AuthorString)
2017-02-22 20:43:29 +08:00
{
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
},
},
}
};
}
}
}
}