osu/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs

107 lines
3.7 KiB
C#
Raw Normal View History

2018-01-05 11:21:19 +00:00
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
2017-03-20 09:24:28 +00:00
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
2017-04-04 03:38:55 +00:00
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.MathUtils;
using osu.Game.Graphics;
2017-04-18 07:05:58 +00:00
using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Taiko.Judgements;
2017-04-04 03:38:55 +00:00
using OpenTK;
using OpenTK.Graphics;
2017-04-18 07:05:58 +00:00
using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.Scoring;
2017-04-18 07:05:58 +00:00
namespace osu.Game.Rulesets.Taiko.Objects.Drawables
{
public class DrawableDrumRoll : DrawableTaikoHitObject<DrumRoll>
{
/// <summary>
2017-04-01 07:32:31 +00:00
/// Number of rolling hits required to reach the dark/final accent colour.
/// </summary>
2017-04-01 07:32:31 +00:00
private const int rolling_hits_for_dark_accent = 5;
private Color4 accentDarkColour;
/// <summary>
2017-04-01 07:34:30 +00:00
/// Rolling number of tick hits. This increases for hits and decreases for misses.
/// </summary>
2017-04-01 07:32:31 +00:00
private int rollingHits;
public DrawableDrumRoll(DrumRoll drumRoll)
: base(drumRoll)
{
2018-01-04 11:56:28 +00:00
RelativeSizeAxes = Axes.Y;
Container<DrawableDrumRollTick> tickContainer;
MainPiece.Add(tickContainer = new Container<DrawableDrumRollTick> { RelativeSizeAxes = Axes.Both });
foreach (var tick in drumRoll.NestedHitObjects.OfType<DrumRollTick>())
{
2017-08-09 07:19:31 +00:00
var newTick = new DrawableDrumRollTick(tick);
newTick.OnJudgement += onTickJudgement;
AddNested(newTick);
tickContainer.Add(newTick);
}
}
protected override TaikoPiece CreateMainPiece() => new ElongatedCirclePiece();
2017-08-20 12:18:21 +00:00
public override bool OnPressed(TaikoAction action) => false;
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
MainPiece.AccentColour = AccentColour = colours.YellowDark;
accentDarkColour = colours.YellowDarker;
}
private void onTickJudgement(DrawableHitObject obj, Judgement judgement)
{
if (judgement.Result > HitResult.Miss)
2017-04-01 07:32:31 +00:00
rollingHits++;
else
2017-04-01 07:32:31 +00:00
rollingHits--;
2017-04-01 07:32:31 +00:00
rollingHits = MathHelper.Clamp(rollingHits, 0, rolling_hits_for_dark_accent);
2017-04-01 07:32:31 +00:00
Color4 newAccent = Interpolation.ValueAt((float)rollingHits / rolling_hits_for_dark_accent, AccentColour, accentDarkColour, 0, 1);
MainPiece.FadeAccent(newAccent, 100);
}
protected override void CheckForJudgements(bool userTriggered, double timeOffset)
{
if (userTriggered)
return;
if (timeOffset < 0)
return;
int countHit = NestedHitObjects?.Count(o => o.IsHit) ?? 0;
if (countHit >= HitObject.RequiredGoodHits)
{
AddJudgement(new TaikoJudgement { Result = countHit >= HitObject.RequiredGreatHits ? HitResult.Great : HitResult.Good });
if (HitObject.IsStrong)
AddJudgement(new TaikoStrongHitJudgement());
}
else
AddJudgement(new TaikoJudgement { Result = HitResult.Miss });
}
2017-03-28 07:50:06 +00:00
protected override void UpdateState(ArmedState state)
{
2018-01-10 10:17:43 +00:00
switch (state)
{
case ArmedState.Hit:
case ArmedState.Miss:
this.FadeOut(100).Expire();
break;
}
2017-03-28 07:50:06 +00:00
}
}
}