Use generics everywhere.

This commit is contained in:
Dean Herbert
2017-03-06 13:59:11 +09:00
parent 20fcb8848b
commit faf07ab51a
16 changed files with 101 additions and 84 deletions

View File

@ -16,8 +16,6 @@ namespace osu.Game.Modes.Objects.Drawables
{
public abstract class DrawableHitObject : Container, IStateful<ArmedState>
{
public event Action<DrawableHitObject, JudgementInfo> OnJudgement;
public override bool HandleInput => Interactive;
public bool Interactive = true;
@ -26,12 +24,7 @@ namespace osu.Game.Modes.Objects.Drawables
public abstract JudgementInfo CreateJudgementInfo();
public HitObject HitObject;
public DrawableHitObject(HitObject hitObject)
{
HitObject = hitObject;
}
protected abstract void UpdateState(ArmedState state);
private ArmedState state;
public ArmedState State
@ -52,20 +45,11 @@ namespace osu.Game.Modes.Objects.Drawables
}
}
SampleChannel sample;
[BackgroundDependencyLoader]
private void load(AudioManager audio)
{
string hitType = ((HitObject.Sample?.Type ?? SampleType.None) == SampleType.None ? SampleType.Normal : HitObject.Sample.Type).ToString().ToLower();
string sampleSet = (HitObject.Sample?.Set ?? SampleSet.Normal).ToString().ToLower();
sample = audio.Sample.Get($@"Gameplay/{sampleSet}-hit{hitType}");
}
protected SampleChannel Sample;
protected virtual void PlaySample()
{
sample?.Play();
Sample?.Play();
}
protected override void LoadComplete()
@ -81,18 +65,18 @@ namespace osu.Game.Modes.Objects.Drawables
Expire(true);
}
}
private List<DrawableHitObject> nestedHitObjects;
public abstract class DrawableHitObject<HitObjectType> : DrawableHitObject
where HitObjectType : HitObject
{
public event Action<DrawableHitObject<HitObjectType>, JudgementInfo> OnJudgement;
protected IEnumerable<DrawableHitObject> NestedHitObjects => nestedHitObjects;
public HitObjectType HitObject;
protected void AddNested(DrawableHitObject h)
public DrawableHitObject(HitObjectType hitObject)
{
if (nestedHitObjects == null)
nestedHitObjects = new List<DrawableHitObject>();
h.OnJudgement += (d, j) => { OnJudgement?.Invoke(d, j); } ;
nestedHitObjects.Add(h);
HitObject = hitObject;
}
/// <summary>
@ -143,7 +127,27 @@ namespace osu.Game.Modes.Objects.Drawables
UpdateJudgement(false);
}
protected abstract void UpdateState(ArmedState state);
[BackgroundDependencyLoader]
private void load(AudioManager audio)
{
string hitType = ((HitObject.Sample?.Type ?? SampleType.None) == SampleType.None ? SampleType.Normal : HitObject.Sample.Type).ToString().ToLower();
string sampleSet = (HitObject.Sample?.Set ?? SampleSet.Normal).ToString().ToLower();
Sample = audio.Sample.Get($@"Gameplay/{sampleSet}-hit{hitType}");
}
private List<DrawableHitObject<HitObjectType>> nestedHitObjects;
protected IEnumerable<DrawableHitObject<HitObjectType>> NestedHitObjects => nestedHitObjects;
protected void AddNested(DrawableHitObject<HitObjectType> h)
{
if (nestedHitObjects == null)
nestedHitObjects = new List<DrawableHitObject<HitObjectType>>();
h.OnJudgement += (d, j) => { OnJudgement?.Invoke(d, j); } ;
nestedHitObjects.Add(h);
}
}
public enum ArmedState

View File

@ -20,7 +20,7 @@ namespace osu.Game.Modes.UI
public event Action OnAllJudged;
public InputManager InputManager;
public abstract bool AllObjectsJudged { get; }
protected void TriggerOnJudgement(JudgementInfo j)
{
@ -28,18 +28,20 @@ namespace osu.Game.Modes.UI
if (AllObjectsJudged)
OnAllJudged?.Invoke();
}
protected Playfield Playfield;
public bool AllObjectsJudged => Playfield.HitObjects.Children.First()?.Judgement.Result != null; //reverse depth sort means First() instead of Last().
public IEnumerable<DrawableHitObject> DrawableObjects => Playfield.HitObjects.Children;
}
public abstract class HitRenderer<T> : HitRenderer
where T : HitObject
public abstract class HitRenderer<TObject> : HitRenderer
where TObject : HitObject
{
private List<T> objects;
private List<TObject> objects;
public InputManager InputManager;
protected Playfield<TObject> Playfield;
public override bool AllObjectsJudged => Playfield.HitObjects.Children.First()?.Judgement.Result != null; //reverse depth sort means First() instead of Last().
public IEnumerable<DrawableHitObject> DrawableObjects => Playfield.HitObjects.Children;
public Beatmap Beatmap
{
@ -51,11 +53,11 @@ namespace osu.Game.Modes.UI
}
}
protected abstract Playfield CreatePlayfield();
protected abstract Playfield<TObject> CreatePlayfield();
protected abstract HitObjectConverter<T> Converter { get; }
protected abstract HitObjectConverter<TObject> Converter { get; }
protected virtual List<T> Convert(Beatmap beatmap) => Converter.Convert(beatmap);
protected virtual List<TObject> Convert(Beatmap beatmap) => Converter.Convert(beatmap);
public HitRenderer()
{
@ -76,9 +78,9 @@ namespace osu.Game.Modes.UI
private void loadObjects()
{
if (objects == null) return;
foreach (T h in objects)
foreach (TObject h in objects)
{
var drawableObject = GetVisualRepresentation(h);
DrawableHitObject<TObject> drawableObject = GetVisualRepresentation(h);
if (drawableObject == null) continue;
@ -89,8 +91,8 @@ namespace osu.Game.Modes.UI
Playfield.PostProcess();
}
private void onJudgement(DrawableHitObject o, JudgementInfo j) => TriggerOnJudgement(j);
private void onJudgement(DrawableHitObject<TObject> o, JudgementInfo j) => TriggerOnJudgement(j);
protected abstract DrawableHitObject GetVisualRepresentation(T h);
protected abstract DrawableHitObject<TObject> GetVisualRepresentation(TObject h);
}
}

View File

@ -6,16 +6,25 @@ using OpenTK;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Input;
using osu.Game.Modes.Objects;
using osu.Game.Modes.Objects.Drawables;
namespace osu.Game.Modes.UI
{
public abstract class Playfield : Container
public abstract class Playfield<T> : Container
where T : HitObject
{
public HitObjectContainer HitObjects;
private Container<Drawable> scaledContent;
public HitObjectContainer<DrawableHitObject<T>> HitObjects;
public virtual void Add(DrawableHitObject h) => HitObjects.Add(h);
public virtual void Add(DrawableHitObject<T> h) => HitObjects.Add(h);
public class HitObjectContainer<U> : Container<U>
where U : Drawable
{
public override bool Contains(Vector2 screenSpacePos) => true;
}
private Container<Drawable> scaledContent;
public override bool Contains(Vector2 screenSpacePos) => true;
@ -37,7 +46,7 @@ namespace osu.Game.Modes.UI
}
});
Add(HitObjects = new HitObjectContainer
Add(HitObjects = new HitObjectContainer<DrawableHitObject<T>>
{
RelativeSizeAxes = Axes.Both,
});

View File

@ -4,12 +4,10 @@
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics;
using osu.Framework.Timing;
using osu.Game.Database;
using osu.Game.Modes;
using osu.Game.Modes.Objects.Drawables;
using osu.Game.Screens.Backgrounds;
using OpenTK;
using osu.Framework.Screens;
@ -18,24 +16,18 @@ using osu.Game.Screens.Ranking;
using osu.Game.Configuration;
using osu.Framework.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using OpenTK.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Transforms;
using osu.Framework.Input;
using osu.Framework.Logging;
using osu.Framework.Input;
using osu.Framework.Input.Handlers;
using osu.Game.Graphics.Cursor;
using osu.Game.Input.Handlers;
namespace osu.Game.Screens.Play
{
public class Player : OsuScreen
{
public bool Autoplay;
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap);
internal override bool ShowOverlays => false;
@ -148,9 +140,6 @@ namespace osu.Game.Screens.Play
//bind ScoreProcessor to ourselves (for a fail situation)
scoreProcessor.Failed += onFail;
if (Autoplay)
hitRenderer.Schedule(() => hitRenderer.DrawableObjects.ForEach(h => h.State = ArmedState.Hit));
Children = new Drawable[]
{
new Container