diff --git a/osu.Game/Graphics/Containers/BeatSyncedContainer.cs b/osu.Game/Graphics/Containers/BeatSyncedContainer.cs
index dfb742f7d1..b9a7183338 100644
--- a/osu.Game/Graphics/Containers/BeatSyncedContainer.cs
+++ b/osu.Game/Graphics/Containers/BeatSyncedContainer.cs
@@ -16,12 +16,19 @@ namespace osu.Game.Graphics.Containers
private int lastBeat;
private ControlPoint lastControlPoint;
+ ///
+ /// The amount of time before a beat we should fire .
+ /// This allows for adding easing to animations that may be synchronised to the beat.
+ ///
+ protected double EarlyActivationMilliseconds;
+
protected override void Update()
{
if (beatmap.Value?.Track == null)
return;
- double currentTrackTime = beatmap.Value.Track.CurrentTime;
+ double currentTrackTime = beatmap.Value.Track.CurrentTime + EarlyActivationMilliseconds;
+
ControlPoint overridePoint;
ControlPoint controlPoint = beatmap.Value.Beatmap.TimingInfo.TimingPointAt(currentTrackTime, out overridePoint);
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index e28adeacff..5f9a3bf655 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -12,21 +12,24 @@ using osu.Framework.Graphics.Textures;
using osu.Framework.Input;
using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
+using osu.Game.Graphics.Containers;
using OpenTK;
using OpenTK.Graphics;
+using osu.Game.Beatmaps.Timing;
namespace osu.Game.Screens.Menu
{
///
/// osu! logo and its attachments (pulsing, visualiser etc.)
///
- public class OsuLogo : Container
+ public class OsuLogo : BeatSyncedContainer
{
public readonly Color4 OsuPink = OsuColour.FromHex(@"e967a1");
private readonly Sprite logo;
private readonly CircularContainer logoContainer;
private readonly Container logoBounceContainer;
+ private readonly Container logoBeatContainer;
private readonly Container logoHoverContainer;
private SampleChannel sampleClick;
@@ -67,8 +70,12 @@ namespace osu.Game.Screens.Menu
private const float default_size = 480;
+ private const double beat_in_time = 60;
+
public OsuLogo()
{
+ EarlyActivationMilliseconds = beat_in_time;
+
Size = new Vector2(default_size);
Anchor = Anchor.Centre;
@@ -78,109 +85,116 @@ namespace osu.Game.Screens.Menu
Children = new Drawable[]
{
- logoBounceContainer = new Container
+ logoBeatContainer = new Container
{
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
{
- logoHoverContainer = new Container
+ logoBounceContainer = new Container
{
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
{
- new BufferedContainer
+ logoHoverContainer = new Container
{
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
{
- logoContainer = new CircularContainer
+ new BufferedContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Children = new Drawable[]
+ {
+ logoContainer = new CircularContainer
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Both,
+ Scale = new Vector2(0.88f),
+ Masking = true,
+ Children = new Drawable[]
+ {
+ colourAndTriangles = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = OsuPink,
+ },
+ new Triangles
+ {
+ TriangleScale = 4,
+ ColourLight = OsuColour.FromHex(@"ff7db7"),
+ ColourDark = OsuColour.FromHex(@"de5b95"),
+ RelativeSizeAxes = Axes.Both,
+ },
+ }
+ },
+ flashLayer = new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ BlendingMode = BlendingMode.Additive,
+ Colour = Color4.White,
+ Alpha = 0,
+ },
+ },
+ },
+ logo = new Sprite
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ },
+ }
+ },
+ rippleContainer = new Container
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
- Scale = new Vector2(0.88f),
+ Children = new Drawable[]
+ {
+ ripple = new Sprite
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ BlendingMode = BlendingMode.Additive,
+ Alpha = 0.15f
+ }
+ }
+ },
+ impactContainer = new CircularContainer
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Alpha = 0,
+ BorderColour = Color4.White,
+ RelativeSizeAxes = Axes.Both,
+ BorderThickness = 10,
Masking = true,
Children = new Drawable[]
{
- colourAndTriangles = new Container
+ new Box
{
RelativeSizeAxes = Axes.Both,
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = OsuPink,
- },
- new Triangles
- {
- TriangleScale = 4,
- ColourLight = OsuColour.FromHex(@"ff7db7"),
- ColourDark = OsuColour.FromHex(@"de5b95"),
- RelativeSizeAxes = Axes.Both,
- },
- }
- },
- flashLayer = new Box
- {
- RelativeSizeAxes = Axes.Both,
- BlendingMode = BlendingMode.Additive,
- Colour = Color4.White,
+ AlwaysPresent = true,
Alpha = 0,
- },
- },
+ }
+ }
},
- logo = new Sprite
+ new MenuVisualisation
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- },
- }
- },
- rippleContainer = new Container
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- RelativeSizeAxes = Axes.Both,
- Children = new Drawable[]
- {
- ripple = new Sprite
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- BlendingMode = BlendingMode.Additive,
- Alpha = 0.15f
- }
- }
- },
- impactContainer = new CircularContainer
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Alpha = 0,
- BorderColour = Color4.White,
- RelativeSizeAxes = Axes.Both,
- BorderThickness = 10,
- Masking = true,
- Children = new Drawable[]
- {
- new Box
- {
RelativeSizeAxes = Axes.Both,
- AlwaysPresent = true,
- Alpha = 0,
+ BlendingMode = BlendingMode.Additive,
+ Alpha = 0.2f,
}
}
- },
- new MenuVisualisation
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- RelativeSizeAxes = Axes.Both,
- BlendingMode = BlendingMode.Additive,
- Alpha = 0.2f,
}
}
}
@@ -206,6 +220,15 @@ namespace osu.Game.Screens.Menu
ripple.Loop(300);
}
+ protected override void OnNewBeat(int newBeat, double beatLength, TimeSignatures timeSignature, bool kiai)
+ {
+ base.OnNewBeat(newBeat, beatLength, timeSignature, kiai);
+
+ logoBeatContainer.ScaleTo(0.97f, beat_in_time, EasingTypes.Out);
+ using (logoBeatContainer.BeginDelayedSequence(beat_in_time))
+ logoBeatContainer.ScaleTo(1, beatLength * 2, EasingTypes.OutQuint);
+ }
+
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
{
if (!Interactive) return false;