mirror of
https://github.com/ppy/osu.git
synced 2024-11-15 04:27:34 +08:00
128 lines
4.3 KiB
C#
128 lines
4.3 KiB
C#
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
|
|
|
using System.Collections.Generic;
|
|
using osu.Framework.Graphics;
|
|
using osu.Framework.Graphics.Containers;
|
|
using osu.Framework.Timing;
|
|
using osu.Game.Rulesets.Objects.Drawables;
|
|
using osu.Game.Rulesets.Osu.Judgements;
|
|
using osu.Game.Rulesets.Osu.Objects;
|
|
using osu.Game.Rulesets.Osu.Objects.Drawables;
|
|
using OpenTK;
|
|
|
|
namespace osu.Desktop.Tests.Visual
|
|
{
|
|
internal class TestCaseHitObjects : OsuTestCase
|
|
{
|
|
private readonly FramedClock framedClock;
|
|
|
|
private bool auto;
|
|
|
|
public TestCaseHitObjects()
|
|
{
|
|
var rateAdjustClock = new StopwatchClock(true);
|
|
framedClock = new FramedClock(rateAdjustClock);
|
|
|
|
AddStep(@"circles", () => loadHitobjects(HitObjectType.Circle));
|
|
AddStep(@"slider", () => loadHitobjects(HitObjectType.Slider));
|
|
AddStep(@"spinner", () => loadHitobjects(HitObjectType.Spinner));
|
|
|
|
AddToggleStep("Auto", state => { auto = state; loadHitobjects(mode); });
|
|
AddSliderStep("Playback speed", 0.0, 2.0, 0.5, v => rateAdjustClock.Rate = v);
|
|
|
|
framedClock.ProcessFrame();
|
|
|
|
var clockAdjustContainer = new Container
|
|
{
|
|
RelativeSizeAxes = Axes.Both,
|
|
Clock = framedClock,
|
|
Children = new[]
|
|
{
|
|
playfieldContainer = new Container { RelativeSizeAxes = Axes.Both },
|
|
approachContainer = new Container { RelativeSizeAxes = Axes.Both }
|
|
}
|
|
};
|
|
|
|
Add(clockAdjustContainer);
|
|
}
|
|
|
|
private HitObjectType mode = HitObjectType.Slider;
|
|
|
|
private readonly Container playfieldContainer;
|
|
private readonly Container approachContainer;
|
|
|
|
private void loadHitobjects(HitObjectType mode)
|
|
{
|
|
this.mode = mode;
|
|
|
|
switch (mode)
|
|
{
|
|
case HitObjectType.Circle:
|
|
const int count = 10;
|
|
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
var h = new HitCircle
|
|
{
|
|
StartTime = framedClock.CurrentTime + 600 + i * 80,
|
|
Position = new Vector2((i - count / 2) * 14),
|
|
};
|
|
|
|
add(new DrawableHitCircle(h));
|
|
}
|
|
break;
|
|
case HitObjectType.Slider:
|
|
add(new DrawableSlider(new Slider
|
|
{
|
|
StartTime = framedClock.CurrentTime + 600,
|
|
ControlPoints = new List<Vector2>
|
|
{
|
|
new Vector2(-200, 0),
|
|
new Vector2(400, 0),
|
|
},
|
|
Distance = 400,
|
|
Position = new Vector2(-200, 0),
|
|
Velocity = 1,
|
|
TickDistance = 100,
|
|
}));
|
|
break;
|
|
case HitObjectType.Spinner:
|
|
add(new DrawableSpinner(new Spinner
|
|
{
|
|
StartTime = framedClock.CurrentTime + 600,
|
|
EndTime = framedClock.CurrentTime + 1600,
|
|
Position = new Vector2(0, 0),
|
|
}));
|
|
break;
|
|
}
|
|
}
|
|
|
|
private int depth;
|
|
|
|
private void add(DrawableOsuHitObject h)
|
|
{
|
|
h.Anchor = Anchor.Centre;
|
|
h.Depth = depth++;
|
|
|
|
if (auto)
|
|
{
|
|
h.State = ArmedState.Hit;
|
|
h.Judgement = new OsuJudgement { Result = HitResult.Hit };
|
|
}
|
|
|
|
playfieldContainer.Add(h);
|
|
var proxyable = h as IDrawableHitObjectWithProxiedApproach;
|
|
if (proxyable != null)
|
|
approachContainer.Add(proxyable.ProxiedLayer.CreateProxy());
|
|
}
|
|
|
|
private enum HitObjectType
|
|
{
|
|
Circle,
|
|
Slider,
|
|
Spinner
|
|
}
|
|
}
|
|
}
|