mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 12:23:22 +08:00
Add nested fruit outlines to juice stream selection blueprint
This commit is contained in:
parent
7833a1b09a
commit
2ba3003934
@ -0,0 +1,53 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
|
using osu.Game.Rulesets.UI.Scrolling;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Catch.Edit.Blueprints.Components
|
||||||
|
{
|
||||||
|
public class NestedOutlineContainer : CompositeDrawable
|
||||||
|
{
|
||||||
|
private readonly Container<FruitOutline> nestedOutlines;
|
||||||
|
|
||||||
|
private readonly List<CatchHitObject> nestedHitObjects = new List<CatchHitObject>();
|
||||||
|
|
||||||
|
public NestedOutlineContainer()
|
||||||
|
{
|
||||||
|
Anchor = Anchor.BottomLeft;
|
||||||
|
|
||||||
|
InternalChild = nestedOutlines = new Container<FruitOutline>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdatePositionFrom(ScrollingHitObjectContainer hitObjectContainer, CatchHitObject parentHitObject)
|
||||||
|
{
|
||||||
|
X = parentHitObject.OriginalX;
|
||||||
|
Y = hitObjectContainer.PositionAtTime(parentHitObject.StartTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateNestedObjectsFrom(ScrollingHitObjectContainer hitObjectContainer, CatchHitObject parentHitObject)
|
||||||
|
{
|
||||||
|
nestedHitObjects.Clear();
|
||||||
|
nestedHitObjects.AddRange(parentHitObject.NestedHitObjects
|
||||||
|
.OfType<CatchHitObject>()
|
||||||
|
.Where(h => !(h is TinyDroplet)));
|
||||||
|
|
||||||
|
while (nestedHitObjects.Count < nestedOutlines.Count)
|
||||||
|
nestedOutlines.Remove(nestedOutlines[^1]);
|
||||||
|
|
||||||
|
while (nestedOutlines.Count < nestedHitObjects.Count)
|
||||||
|
nestedOutlines.Add(new FruitOutline());
|
||||||
|
|
||||||
|
for (int i = 0; i < nestedHitObjects.Count; i++)
|
||||||
|
{
|
||||||
|
var hitObject = nestedHitObjects[i];
|
||||||
|
nestedOutlines[i].UpdateFrom(hitObjectContainer, hitObject, parentHitObject);
|
||||||
|
nestedOutlines[i].Scale *= hitObject is Droplet ? 0.5f : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Caching;
|
using osu.Framework.Caching;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
using osu.Game.Rulesets.Catch.Edit.Blueprints.Components;
|
using osu.Game.Rulesets.Catch.Edit.Blueprints.Components;
|
||||||
using osu.Game.Rulesets.Catch.Objects;
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
@ -21,12 +22,18 @@ namespace osu.Game.Rulesets.Catch.Edit.Blueprints
|
|||||||
|
|
||||||
private readonly ScrollingPath scrollingPath;
|
private readonly ScrollingPath scrollingPath;
|
||||||
|
|
||||||
|
private readonly NestedOutlineContainer nestedOutlineContainer;
|
||||||
|
|
||||||
private readonly Cached pathCache = new Cached();
|
private readonly Cached pathCache = new Cached();
|
||||||
|
|
||||||
public JuiceStreamSelectionBlueprint(JuiceStream hitObject)
|
public JuiceStreamSelectionBlueprint(JuiceStream hitObject)
|
||||||
: base(hitObject)
|
: base(hitObject)
|
||||||
{
|
{
|
||||||
InternalChild = scrollingPath = new ScrollingPath();
|
InternalChildren = new Drawable[]
|
||||||
|
{
|
||||||
|
scrollingPath = new ScrollingPath(),
|
||||||
|
nestedOutlineContainer = new NestedOutlineContainer()
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -43,10 +50,13 @@ namespace osu.Game.Rulesets.Catch.Edit.Blueprints
|
|||||||
if (!IsSelected) return;
|
if (!IsSelected) return;
|
||||||
|
|
||||||
scrollingPath.UpdatePositionFrom(HitObjectContainer, HitObject);
|
scrollingPath.UpdatePositionFrom(HitObjectContainer, HitObject);
|
||||||
|
nestedOutlineContainer.UpdatePositionFrom(HitObjectContainer, HitObject);
|
||||||
|
|
||||||
if (pathCache.IsValid) return;
|
if (pathCache.IsValid) return;
|
||||||
|
|
||||||
scrollingPath.UpdatePathFrom(HitObjectContainer, HitObject);
|
scrollingPath.UpdatePathFrom(HitObjectContainer, HitObject);
|
||||||
|
nestedOutlineContainer.UpdateNestedObjectsFrom(HitObjectContainer, HitObject);
|
||||||
|
|
||||||
pathCache.Validate();
|
pathCache.Validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user