osu/osu.Game/Beatmaps/Objects/Osu/Drawable/DrawableCircle.cs

358 lines
12 KiB
C#
Raw Normal View History

//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
using osu.Framework;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures;
using osu.Framework.Graphics.Transformations;
using osu.Framework.Input;
using osu.Framework.MathUtils;
2016-11-02 03:22:29 +00:00
using OpenTK;
namespace osu.Game.Beatmaps.Objects.Osu.Drawable
{
public class DrawableCircle : DrawableHitObject
{
private Sprite approachCircle;
2016-11-02 03:22:29 +00:00
private CircleLayer circle;
private RingLayer ring;
private FlashLayer flash;
private ExplodeLayer explode;
private NumberLayer number;
private GlowLayer glow;
private OsuBaseHit h;
public DrawableCircle(Circle h) : base(h)
{
this.h = h;
Origin = Anchor.Centre;
Alpha = 0;
Position = h.Position;
Scale = new Vector2(0.4f);
Children = new Framework.Graphics.Drawable[]
{
2016-11-02 03:22:29 +00:00
glow = new GlowLayer
{
2016-11-02 03:22:29 +00:00
Colour = h.Colour
},
2016-11-02 03:22:29 +00:00
circle = new CircleLayer
{
Colour = h.Colour,
Hit = delegate { State = ArmedState.Armed; }
},
2016-11-02 03:22:29 +00:00
number = new NumberLayer(),
ring = new RingLayer(),
flash = new FlashLayer(),
explode = new ExplodeLayer
{
Colour = h.Colour
},
approachCircle = new Sprite
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Colour = h.Colour
}
};
Size = new Vector2(100);
}
2016-11-01 14:24:14 +00:00
protected override void Load(BaseGame game)
{
base.Load(game);
approachCircle.Texture = game.Textures.Get(@"Play/osu/approachcircle@2x");
}
protected override void LoadComplete()
{
base.LoadComplete();
//force application of the state that was set before we loaded.
UpdateState(State);
}
protected override void UpdateState(ArmedState state)
{
if (!IsLoaded) return;
Flush(); //move to DrawableHitObject
2016-10-28 08:42:00 +00:00
Transforms.Add(new TransformAlpha { StartTime = h.StartTime - 1000, EndTime = h.StartTime - 800, StartValue = 0, EndValue = 1 });
2016-10-28 08:42:00 +00:00
approachCircle.Transforms.Add(new TransformScale { StartTime = h.StartTime - 1000, EndTime = h.StartTime, StartValue = new Vector2(2f), EndValue = new Vector2(0.6f) });
approachCircle.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime, StartValue = 1, EndValue = 0 });
2016-10-28 08:42:00 +00:00
glow.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = glow.Alpha, EndValue = 0 });
switch (state)
{
case ArmedState.Disarmed:
2016-10-28 08:42:00 +00:00
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 });
break;
case ArmedState.Armed:
const float flashIn = 30;
const float fadeOut = 800;
2016-10-28 08:42:00 +00:00
//Transforms.Add(new TransformScale() { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = Scale, EndValue = Scale * 1.1f });
2016-10-28 08:42:00 +00:00
ring.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
circle.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
number.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
2016-10-28 08:42:00 +00:00
flash.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0.8f });
flash.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + 100, StartValue = 0.8f, EndValue = 0 });
2016-10-28 08:42:00 +00:00
explode.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 1 });
2016-10-28 08:42:00 +00:00
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + fadeOut, StartValue = 1, EndValue = 0 });
2016-10-28 08:42:00 +00:00
Transforms.Add(new TransformScale { StartTime = h.StartTime + h.Duration, EndTime = h.StartTime + h.Duration + 400, StartValue = Scale, EndValue = Scale * 1.5f, Easing = EasingTypes.OutQuad });
break;
}
}
2016-11-02 03:22:29 +00:00
class NumberLayer : Container
{
private Sprite number;
2016-11-02 03:22:29 +00:00
public NumberLayer()
{
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
Children = new[]
{
number = new Sprite
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
2016-11-02 03:22:29 +00:00
Alpha = 1
}
};
}
2016-11-01 14:24:14 +00:00
protected override void Load(BaseGame game)
{
base.Load(game);
number.Texture = game.Textures.Get(@"Play/osu/number@2x");
}
}
2016-11-02 03:22:29 +00:00
class GlowLayer : Container
{
private Sprite layer3;
2016-11-02 03:22:29 +00:00
public GlowLayer()
{
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
Children = new[]
{
layer3 = new Sprite
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Additive = true,
2016-11-02 03:22:29 +00:00
Alpha = 0.5f
}
};
}
2016-11-01 14:24:14 +00:00
protected override void Load(BaseGame game)
{
base.Load(game);
layer3.Texture = game.Textures.Get(@"Play/osu/ring-glow@2x");
}
}
2016-11-02 03:22:29 +00:00
class RingLayer : Container
{
private Sprite ring;
2016-11-02 03:22:29 +00:00
public RingLayer()
{
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
Children = new Framework.Graphics.Drawable[]
{
ring = new Sprite
{
Anchor = Anchor.Centre,
2016-11-02 03:22:29 +00:00
Origin = Anchor.Centre
}
};
}
2016-11-01 14:24:14 +00:00
protected override void Load(BaseGame game)
{
base.Load(game);
ring.Texture = game.Textures.Get(@"Play/osu/ring@2x");
}
}
2016-11-02 03:22:29 +00:00
class FlashLayer : Container
{
2016-11-02 03:22:29 +00:00
public FlashLayer()
{
Size = new Vector2(144);
Masking = true;
CornerRadius = Size.X / 2;
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
Additive = true;
Alpha = 0;
Children = new Framework.Graphics.Drawable[]
{
new Box
{
2016-11-02 03:22:29 +00:00
RelativeSizeAxes = Axes.Both
}
};
}
}
2016-11-02 03:22:29 +00:00
class ExplodeLayer : Container
{
2016-11-02 03:22:29 +00:00
public ExplodeLayer()
{
Size = new Vector2(144);
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
Additive = true;
Alpha = 0;
Children = new Framework.Graphics.Drawable[]
{
new Triangles
{
2016-11-02 03:22:29 +00:00
RelativeSizeAxes = Axes.Both
}
};
}
class Triangles : Container
{
private Texture tex;
2016-11-01 14:24:14 +00:00
protected override void Load(BaseGame game)
{
base.Load(game);
tex = game.Textures.Get(@"Play/osu/triangle@2x");
for (int i = 0; i < 10; i++)
{
Add(new Sprite
{
Texture = tex,
Origin = Anchor.Centre,
Position = new Vector2(RNG.NextSingle() * DrawSize.X, RNG.NextSingle() * DrawSize.Y),
Scale = new Vector2(RNG.NextSingle() * 0.4f + 0.2f),
2016-11-02 03:22:29 +00:00
Alpha = RNG.NextSingle() * 0.3f
});
}
}
protected override void Update()
{
base.Update();
foreach (Framework.Graphics.Drawable d in Children)
d.Position -= new Vector2(0, (float)(d.Scale.X * (Clock.ElapsedFrameTime / 20)));
}
}
}
2016-11-02 03:22:29 +00:00
class CircleLayer : Container
{
private Sprite disc;
private Triangles triangles;
public Action Hit;
2016-11-02 03:22:29 +00:00
public CircleLayer()
{
Size = new Vector2(144);
Masking = true;
CornerRadius = DrawSize.X / 2;
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
Children = new Framework.Graphics.Drawable[]
{
disc = new Sprite
{
Anchor = Anchor.Centre,
2016-11-02 03:22:29 +00:00
Origin = Anchor.Centre
},
triangles = new Triangles
{
Additive = true,
2016-11-02 03:22:29 +00:00
RelativeSizeAxes = Axes.Both
}
};
}
2016-11-01 14:24:14 +00:00
protected override void Load(BaseGame game)
{
base.Load(game);
disc.Texture = game.Textures.Get(@"Play/osu/disc@2x");
}
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args)
{
Hit?.Invoke();
return true;
}
class Triangles : Container
{
private Texture tex;
2016-11-01 14:24:14 +00:00
protected override void Load(BaseGame game)
{
base.Load(game);
tex = game.Textures.Get(@"Play/osu/triangle@2x");
for (int i = 0; i < 10; i++)
{
Add(new Sprite
{
Texture = tex,
Origin = Anchor.Centre,
Position = new Vector2(RNG.NextSingle() * DrawSize.X, RNG.NextSingle() * DrawSize.Y),
Scale = new Vector2(RNG.NextSingle() * 0.4f + 0.2f),
2016-11-02 03:22:29 +00:00
Alpha = RNG.NextSingle() * 0.3f
});
}
}
protected override void Update()
{
base.Update();
foreach (Framework.Graphics.Drawable d in Children)
d.Position -= new Vector2(0, (float)(d.Scale.X * (Clock.ElapsedFrameTime / 20)));
}
}
}
}
}