Merge branch 'master'

This commit is contained in:
Huo Yaoyuan 2016-11-06 00:10:38 +08:00
commit c470140d64
36 changed files with 452 additions and 252 deletions

@ -1 +1 @@
Subproject commit 2b9a56e8b3bb6c99bf4c75307639e6726fe8d3ec Subproject commit ed33cc48996e9b57093c4d057aa0560319495dee

@ -1 +1 @@
Subproject commit c0781d1d557c3e5a00f6cf1780049e382f92c0c8 Subproject commit 5ce263988735b3f15c1195568b65fef40756198c

View File

@ -8,6 +8,7 @@ using osu.Framework.Timing;
using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects;
using osu.Game.Beatmaps.Objects.Osu; using osu.Game.Beatmaps.Objects.Osu;
using osu.Game.Beatmaps.Objects.Osu.Drawable; using osu.Game.Beatmaps.Objects.Osu.Drawable;
using OpenTK;
namespace osu.Desktop.VisualTests.Tests namespace osu.Desktop.VisualTests.Tests
{ {
@ -33,12 +34,14 @@ namespace osu.Desktop.VisualTests.Tests
ourClock.ProcessFrame(); ourClock.ProcessFrame();
for (int i = 0; i < 20; i++) const int count = 10;
for (int i = 0; i < count; i++)
{ {
var h = new Circle var h = new Circle
{ {
StartTime = ourClock.CurrentTime + 1000 + i * 80, StartTime = ourClock.CurrentTime + 1000 + i * 80,
Position = new OpenTK.Vector2(i * 14), Position = new Vector2((i - count / 2) * 14),
}; };
Add(new DrawableCircle(h) Add(new DrawableCircle(h)

View File

@ -6,6 +6,7 @@ using osu.Framework.GameModes.Testing;
using osu.Framework.MathUtils; using osu.Framework.MathUtils;
using osu.Framework.Timing; using osu.Framework.Timing;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Formats;
using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects;
using osu.Game.Beatmaps.Objects.Osu; using osu.Game.Beatmaps.Objects.Osu;
using osu.Game.GameModes.Play; using osu.Game.GameModes.Play;
@ -38,21 +39,25 @@ namespace osu.Desktop.VisualTests.Tests
objects.Add(new Circle() objects.Add(new Circle()
{ {
StartTime = time, StartTime = time,
Position = new Vector2(RNG.Next(100, 400), RNG.Next(100, 200)) Position = new Vector2(RNG.Next(0, 512), RNG.Next(0, 384)),
NewCombo = i % 4 == 0
}); });
time += 500; time += 500;
} }
var decoder = new ConstructableBeatmapDecoder();
Beatmap b = new Beatmap
{
HitObjects = objects
};
decoder.Process(b);
Add(new Player Add(new Player
{ {
Beatmap = new WorkingBeatmap Beatmap = new WorkingBeatmap(b)
{
Beatmap = new Beatmap
{
HitObjects = objects
}
}
}); });
} }

View File

@ -29,7 +29,7 @@ namespace osu.Desktop.Beatmaps.IO
beatmaps = Directory.GetFiles(basePath, @"*.osu").Select(f => Path.GetFileName(f)).ToArray(); beatmaps = Directory.GetFiles(basePath, @"*.osu").Select(f => Path.GetFileName(f)).ToArray();
if (beatmaps.Length == 0) if (beatmaps.Length == 0)
throw new FileNotFoundException(@"This directory contains no beatmaps"); throw new FileNotFoundException(@"This directory contains no beatmaps");
using (var stream = new StreamReader(ReadFile(beatmaps[0]))) using (var stream = new StreamReader(GetStream(beatmaps[0])))
{ {
var decoder = BeatmapDecoder.GetDecoder(stream); var decoder = BeatmapDecoder.GetDecoder(stream);
firstMap = decoder.Decode(stream); firstMap = decoder.Decode(stream);
@ -41,7 +41,7 @@ namespace osu.Desktop.Beatmaps.IO
return beatmaps; return beatmaps;
} }
public override Stream ReadFile(string name) public override Stream GetStream(string name)
{ {
return File.OpenRead(Path.Combine(basePath, name)); return File.OpenRead(Path.Combine(basePath, name));
} }

View File

@ -8,6 +8,7 @@ using osu.Framework.Desktop.Platform;
using osu.Framework.Platform; using osu.Framework.Platform;
using osu.Game.Database; using osu.Game.Database;
using osu.Game.IPC; using osu.Game.IPC;
using osu.Game.GameModes.Play;
namespace osu.Game.Tests.Beatmaps.IO namespace osu.Game.Tests.Beatmaps.IO
{ {
@ -45,7 +46,7 @@ namespace osu.Game.Tests.Beatmaps.IO
var importer = new BeatmapImporter(client); var importer = new BeatmapImporter(client);
if (!importer.Import(osz_path).Wait(1000)) if (!importer.Import(osz_path).Wait(1000))
Assert.Fail(@"IPC took too long to send"); Assert.Fail(@"IPC took too long to send");
ensureLoaded(osu, 10000); ensureLoaded(osu, 10000);
} }
@ -78,7 +79,7 @@ namespace osu.Game.Tests.Beatmaps.IO
@"BeatmapSet did not import to the database"); @"BeatmapSet did not import to the database");
//ensure we were stored to beatmap database backing... //ensure we were stored to beatmap database backing...
Assert.IsTrue(resultSets.Count() == 1); Assert.IsTrue(resultSets.Count() == 1);
IEnumerable<BeatmapInfo> resultBeatmaps = null; IEnumerable<BeatmapInfo> resultBeatmaps = null;
@ -103,7 +104,7 @@ namespace osu.Game.Tests.Beatmaps.IO
Assert.IsTrue(set.Beatmaps.Count > 0); Assert.IsTrue(set.Beatmaps.Count > 0);
var beatmap = osu.Beatmaps.GetBeatmap(set.Beatmaps[0]); var beatmap = osu.Beatmaps.GetBeatmap(set.Beatmaps.First(b => b.Mode == PlayMode.Osu));
Assert.IsTrue(beatmap.HitObjects.Count > 0); Assert.IsTrue(beatmap.HitObjects.Count > 0);
} }

View File

@ -70,7 +70,7 @@ namespace osu.Game.Tests.Beatmaps.IO
{ {
var reader = new OszArchiveReader(osz); var reader = new OszArchiveReader(osz);
using (var stream = new StreamReader( using (var stream = new StreamReader(
reader.ReadFile("Soleily - Renatus (Deif) [Platter].osu"))) reader.GetStream("Soleily - Renatus (Deif) [Platter].osu")))
{ {
Assert.AreEqual("osu file format v13", stream.ReadLine().Trim()); Assert.AreEqual("osu file format v13", stream.ReadLine().Trim());
} }

View File

@ -52,7 +52,7 @@ namespace osu.Game.Beatmaps.Drawable
header.State = PanelSelectedState.Selected; header.State = PanelSelectedState.Selected;
break; break;
case BeatmapGroupState.Collapsed: case BeatmapGroupState.Collapsed:
FadeTo(0.5f, 250); FadeTo(0.8f, 250);
header.State = PanelSelectedState.NotSelected; header.State = PanelSelectedState.NotSelected;
difficulties.Hide(); difficulties.Hide();
@ -61,7 +61,7 @@ namespace osu.Game.Beatmaps.Drawable
} }
} }
public BeatmapGroup(BeatmapSetInfo beatmapSet) public BeatmapGroup(BeatmapSetInfo beatmapSet, WorkingBeatmap working)
{ {
this.beatmapSet = beatmapSet; this.beatmapSet = beatmapSet;
@ -78,7 +78,7 @@ namespace osu.Game.Beatmaps.Drawable
Direction = FlowDirection.VerticalOnly, Direction = FlowDirection.VerticalOnly,
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
{ {
header = new BeatmapSetHeader(beatmapSet) header = new BeatmapSetHeader(beatmapSet, working)
{ {
GainedSelection = headerGainedSelection, GainedSelection = headerGainedSelection,
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,

View File

@ -29,7 +29,7 @@ namespace osu.Game.Beatmaps.Drawable
public BeatmapPanel(BeatmapInfo beatmap) public BeatmapPanel(BeatmapInfo beatmap)
{ {
Beatmap = beatmap; Beatmap = beatmap;
Height *= 0.75f; Height *= 0.60f;
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
{ {
@ -44,12 +44,20 @@ namespace osu.Game.Beatmaps.Drawable
Padding = new MarginPadding(5), Padding = new MarginPadding(5),
Direction = FlowDirection.HorizontalOnly, Direction = FlowDirection.HorizontalOnly,
AutoSizeAxes = Axes.Both, AutoSizeAxes = Axes.Both,
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
{ {
new DifficultyIcon(FontAwesome.dot_circle_o, new Color4(159, 198, 0, 255)), new DifficultyIcon(FontAwesome.dot_circle_o, new Color4(159, 198, 0, 255))
{
Scale = new Vector2(1.8f),
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
},
new FlowContainer new FlowContainer
{ {
Padding = new MarginPadding { Left = 10 }, Padding = new MarginPadding { Left = 5 },
Spacing = new Vector2(0, 5),
Direction = FlowDirection.VerticalOnly, Direction = FlowDirection.VerticalOnly,
AutoSizeAxes = Axes.Both, AutoSizeAxes = Axes.Both,
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
@ -58,17 +66,32 @@ namespace osu.Game.Beatmaps.Drawable
{ {
Direction = FlowDirection.HorizontalOnly, Direction = FlowDirection.HorizontalOnly,
AutoSizeAxes = Axes.Both, AutoSizeAxes = Axes.Both,
Spacing = new Vector2(4, 0),
Children = new[] Children = new[]
{ {
new SpriteText new SpriteText
{ {
Font = @"Exo2.0-Medium",
Text = beatmap.Version, Text = beatmap.Version,
TextSize = 20, TextSize = 20,
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft
}, },
new SpriteText new SpriteText
{ {
Text = $" mapped by {(beatmap.Metadata ?? beatmap.BeatmapSet.Metadata).Author}", Font = @"Exo2.0-Medium",
Text = "mapped by",
TextSize = 16, TextSize = 16,
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft
},
new SpriteText
{
Font = @"Exo2.0-MediumItalic",
Text = $"{(beatmap.Metadata ?? beatmap.BeatmapSet.Metadata).Author}",
TextSize = 16,
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft
}, },
} }
}, },

View File

@ -31,27 +31,18 @@ namespace osu.Game.Beatmaps.Drawable
Width = 0.8f; Width = 0.8f;
} }
public BeatmapSetHeader(BeatmapSetInfo beatmapSet) public BeatmapSetHeader(BeatmapSetInfo beatmapSet, WorkingBeatmap working)
{ {
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
{ {
new Box working.Background == null ? new Box{ RelativeSizeAxes = Axes.Both, Colour = new Color4(20, 20, 20, 255) } : new Sprite
{ {
Colour = new Color4(85, 85, 85, 255), Texture = working.Background,
RelativeSizeAxes = Axes.Both, Anchor = Anchor.Centre,
}, Origin = Anchor.Centre,
new Container Scale = new Vector2(0.5f),
{ Colour = new Color4(200, 200, 200, 255),
RelativeSizeAxes = Axes.Both, },
Children = new Framework.Graphics.Drawable[]
{
new Box // TODO: Gradient
{
Colour = new Color4(0, 0, 0, 100),
RelativeSizeAxes = Axes.Both,
}
}
},
new FlowContainer new FlowContainer
{ {
Direction = FlowDirection.VerticalOnly, Direction = FlowDirection.VerticalOnly,
@ -60,14 +51,15 @@ namespace osu.Game.Beatmaps.Drawable
AutoSizeAxes = Axes.Both, AutoSizeAxes = Axes.Both,
Children = new[] Children = new[]
{ {
// TODO: Make these italic
new SpriteText new SpriteText
{ {
Font = @"Exo2.0-SemiBoldItalic",
Text = beatmapSet.Metadata.Title ?? beatmapSet.Metadata.TitleUnicode, Text = beatmapSet.Metadata.Title ?? beatmapSet.Metadata.TitleUnicode,
TextSize = 20 TextSize = 22
}, },
new SpriteText new SpriteText
{ {
Font = @"Exo2.0-MediumItalic",
Text = beatmapSet.Metadata.Artist ?? beatmapSet.Metadata.ArtistUnicode, Text = beatmapSet.Metadata.Artist ?? beatmapSet.Metadata.ArtistUnicode,
TextSize = 16 TextSize = 16
}, },

View File

@ -10,6 +10,7 @@ using osu.Framework;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Input; using osu.Framework.Input;
using OpenTK;
using OpenTK.Graphics; using OpenTK.Graphics;
namespace osu.Game.Beatmaps.Drawable namespace osu.Game.Beatmaps.Drawable
@ -22,12 +23,14 @@ namespace osu.Game.Beatmaps.Drawable
Masking = true; Masking = true;
CornerRadius = 10; CornerRadius = 10;
BorderColour = new Color4(221, 255, 255, 0); BorderColour = new Color4(221, 255, 255, 255);
RelativeSizeAxes = Axes.X; RelativeSizeAxes = Axes.X;
Deselected();
} }
private PanelSelectedState state; private PanelSelectedState state = PanelSelectedState.NotSelected;
public PanelSelectedState State public PanelSelectedState State
{ {
@ -52,7 +55,6 @@ namespace osu.Game.Beatmaps.Drawable
protected virtual void Selected() protected virtual void Selected()
{ {
BorderColour = new Color4(BorderColour.R, BorderColour.G, BorderColour.B, 1f);
BorderThickness = 2.5f; BorderThickness = 2.5f;
EdgeEffect = new EdgeEffect EdgeEffect = new EdgeEffect
@ -66,10 +68,15 @@ namespace osu.Game.Beatmaps.Drawable
protected virtual void Deselected() protected virtual void Deselected()
{ {
BorderColour = new Color4(BorderColour.R, BorderColour.G, BorderColour.B, 0);
BorderThickness = 0; BorderThickness = 0;
EdgeEffect = new EdgeEffect { Type = EdgeEffectType.None }; EdgeEffect = new EdgeEffect
{
Type = EdgeEffectType.Shadow,
Offset = new Vector2(1),
Radius = 10,
Colour = new Color4(0, 0, 0, 100),
};
} }
protected override bool OnClick(InputState state) protected override bool OnClick(InputState state)

View File

@ -1,13 +1,15 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using osu.Game.Beatmaps.Objects;
using OpenTK.Graphics;
namespace osu.Game.Beatmaps.Formats namespace osu.Game.Beatmaps.Formats
{ {
public abstract class BeatmapDecoder public abstract class BeatmapDecoder
{ {
private static Dictionary<string, Type> decoders { get; } = new Dictionary<string, Type>(); private static Dictionary<string, Type> decoders { get; } = new Dictionary<string, Type>();
public static BeatmapDecoder GetDecoder(TextReader stream) public static BeatmapDecoder GetDecoder(TextReader stream)
{ {
var line = stream.ReadLine().Trim(); var line = stream.ReadLine().Trim();
@ -20,7 +22,39 @@ namespace osu.Game.Beatmaps.Formats
{ {
decoders[magic] = typeof(T); decoders[magic] = typeof(T);
} }
public abstract Beatmap Decode(TextReader stream); public virtual Beatmap Decode(TextReader stream)
{
Beatmap b = ParseFile(stream);
Process(b);
return b;
}
public virtual Beatmap Process(Beatmap beatmap)
{
ApplyColours(beatmap);
return beatmap;
}
protected abstract Beatmap ParseFile(TextReader stream);
public virtual void ApplyColours(Beatmap b)
{
List<Color4> colours = b.ComboColors ?? new List<Color4>() {
new Color4(17, 136, 170, 255),
new Color4(102,136,0, 255),
new Color4(204,102,0, 255),
new Color4(121,9,13, 255),
};
int i = -1;
foreach (HitObject h in b.HitObjects)
{
if (h.NewCombo) i = (i + 1) % colours.Count;
h.Colour = colours[i];
}
}
} }
} }

View File

@ -0,0 +1,20 @@
//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 System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace osu.Game.Beatmaps.Formats
{
public class ConstructableBeatmapDecoder : BeatmapDecoder
{
protected override Beatmap ParseFile(TextReader stream)
{
throw new NotImplementedException();
}
}
}

View File

@ -207,7 +207,7 @@ namespace osu.Game.Beatmaps.Formats
}); });
} }
public override Beatmap Decode(TextReader stream) protected override Beatmap ParseFile(TextReader stream)
{ {
var beatmap = new Beatmap var beatmap = new Beatmap
{ {
@ -270,7 +270,9 @@ namespace osu.Game.Beatmaps.Formats
handleColours(beatmap, key, val); handleColours(beatmap, key, val);
break; break;
case Section.HitObjects: case Section.HitObjects:
beatmap.HitObjects.Add(HitObject.Parse(beatmap.BeatmapInfo.Mode, val)); var h = HitObject.Parse(beatmap.BeatmapInfo.Mode, val);
if (h != null)
beatmap.HitObjects.Add(h);
break; break;
} }
} }

View File

@ -1,12 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using osu.Framework.IO.Stores;
using osu.Framework.Platform; using osu.Framework.Platform;
using osu.Game.Database; using osu.Game.Database;
namespace osu.Game.Beatmaps.IO namespace osu.Game.Beatmaps.IO
{ {
public abstract class ArchiveReader : IDisposable public abstract class ArchiveReader : IDisposable, IResourceStore<byte[]>
{ {
private class Reader private class Reader
{ {
@ -42,8 +43,23 @@ namespace osu.Game.Beatmaps.IO
/// <summary> /// <summary>
/// Opens a stream for reading a specific file from this archive. /// Opens a stream for reading a specific file from this archive.
/// </summary> /// </summary>
public abstract Stream ReadFile(string name); public abstract Stream GetStream(string name);
public abstract void Dispose(); public abstract void Dispose();
public virtual byte[] Get(string name)
{
using (Stream input = GetStream(name))
{
if (input == null)
return null;
using (MemoryStream ms = new MemoryStream())
{
input.CopyTo(ms);
return ms.ToArray();
}
}
}
} }
} }

View File

@ -33,7 +33,7 @@ namespace osu.Game.Beatmaps.IO
.Select(e => e.FileName).ToArray(); .Select(e => e.FileName).ToArray();
if (beatmaps.Length == 0) if (beatmaps.Length == 0)
throw new FileNotFoundException(@"This directory contains no beatmaps"); throw new FileNotFoundException(@"This directory contains no beatmaps");
using (var stream = new StreamReader(ReadFile(beatmaps[0]))) using (var stream = new StreamReader(GetStream(beatmaps[0])))
{ {
var decoder = BeatmapDecoder.GetDecoder(stream); var decoder = BeatmapDecoder.GetDecoder(stream);
firstMap = decoder.Decode(stream); firstMap = decoder.Decode(stream);
@ -45,7 +45,7 @@ namespace osu.Game.Beatmaps.IO
return beatmaps; return beatmaps;
} }
public override Stream ReadFile(string name) public override Stream GetStream(string name)
{ {
ZipEntry entry = archive.Entries.SingleOrDefault(e => e.FileName == name); ZipEntry entry = archive.Entries.SingleOrDefault(e => e.FileName == name);
if (entry == null) if (entry == null)

View File

@ -14,14 +14,18 @@ namespace osu.Game.Beatmaps.Objects
{ {
public abstract class DrawableHitObject : Container, IStateful<ArmedState> public abstract class DrawableHitObject : Container, IStateful<ArmedState>
{ {
//todo: move to a more central implementation. this logic should not be at a drawable level.
public Action<DrawableHitObject> OnHit; public Action<DrawableHitObject> OnHit;
public Action<DrawableHitObject> OnMiss; public Action<DrawableHitObject> OnMiss;
public Func<DrawableHitObject, bool> AllowHit;
public HitObject HitObject; public HitObject HitObject;
public DrawableHitObject(HitObject hitObject) public DrawableHitObject(HitObject hitObject)
{ {
HitObject = hitObject; HitObject = hitObject;
Depth = -(float)hitObject.StartTime;
} }
private ArmedState state; private ArmedState state;
@ -31,12 +35,29 @@ namespace osu.Game.Beatmaps.Objects
set set
{ {
if (state == value) return;
state = value; state = value;
UpdateState(state); UpdateState(state);
} }
} }
protected double? HitTime;
protected virtual bool Hit()
{
if (State != ArmedState.Disarmed)
return false;
if (AllowHit?.Invoke(this) == false)
return false;
HitTime = Time;
State = ArmedState.Armed;
return true;
}
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.LoadComplete(); base.LoadComplete();

View File

@ -4,6 +4,7 @@
using osu.Game.Beatmaps.Objects.Osu; using osu.Game.Beatmaps.Objects.Osu;
using osu.Game.Beatmaps.Samples; using osu.Game.Beatmaps.Samples;
using osu.Game.GameModes.Play; using osu.Game.GameModes.Play;
using OpenTK.Graphics;
namespace osu.Game.Beatmaps.Objects namespace osu.Game.Beatmaps.Objects
{ {
@ -15,6 +16,10 @@ namespace osu.Game.Beatmaps.Objects
public double StartTime; public double StartTime;
public virtual double EndTime => StartTime; public virtual double EndTime => StartTime;
public bool NewCombo { get; set; }
public Color4 Colour = new Color4(17, 136, 170, 255);
public double Duration => EndTime - StartTime; public double Duration => EndTime - StartTime;
public HitSampleInfo Sample; public HitSampleInfo Sample;

View File

@ -7,6 +7,5 @@ namespace osu.Game.Beatmaps.Objects.Osu
{ {
public class Circle : OsuBaseHit public class Circle : OsuBaseHit
{ {
public Color4 Colour = new Color4(17, 136, 170, 255);
} }
} }

View File

@ -8,22 +8,21 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.Textures; using osu.Framework.Graphics.Textures;
using osu.Framework.Graphics.Transformations; using osu.Framework.Graphics.Transformations;
using OpenTK;
using OpenTK.Graphics;
using osu.Framework.Input; using osu.Framework.Input;
using osu.Framework.MathUtils; using osu.Framework.MathUtils;
using OpenTK;
namespace osu.Game.Beatmaps.Objects.Osu.Drawable namespace osu.Game.Beatmaps.Objects.Osu.Drawable
{ {
public class DrawableCircle : DrawableHitObject public class DrawableCircle : DrawableHitObject
{ {
private Sprite approachCircle; private Sprite approachCircle;
private CirclePart circle; private CircleLayer circle;
private RingPart ring; private RingLayer ring;
private FlashPart flash; private FlashLayer flash;
private ExplodePart explode; private ExplodeLayer explode;
private NumberPart number; private NumberLayer number;
private GlowPart glow; private GlowLayer glow;
private OsuBaseHit h; private OsuBaseHit h;
public DrawableCircle(Circle h) : base(h) public DrawableCircle(Circle h) : base(h)
@ -31,28 +30,27 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
this.h = h; this.h = h;
Origin = Anchor.Centre; Origin = Anchor.Centre;
Alpha = 0; RelativePositionAxes = Axes.Both;
Position = h.Position; Position = new Vector2(h.Position.X / 512, h.Position.Y / 384);
Scale = new Vector2(0.4f);
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
{ {
glow = new GlowPart() glow = new GlowLayer
{
Colour = h.Colour,
},
circle = new CirclePart()
{
Colour = h.Colour,
Hit = delegate { State = ArmedState.Armed; }
},
number = new NumberPart(),
ring = new RingPart(),
flash = new FlashPart(),
explode = new ExplodePart()
{ {
Colour = h.Colour Colour = h.Colour
}, },
circle = new CircleLayer
{
Colour = h.Colour,
Hit = Hit,
},
number = new NumberLayer(),
ring = new RingLayer(),
flash = new FlashLayer(),
explode = new ExplodeLayer
{
Colour = h.Colour,
},
approachCircle = new Sprite approachCircle = new Sprite
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
@ -61,7 +59,8 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
} }
}; };
Size = new Vector2(100); //may not be so correct
Size = circle.DrawSize;
} }
protected override void Load(BaseGame game) protected override void Load(BaseGame game)
@ -71,63 +70,82 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
approachCircle.Texture = game.Textures.Get(@"Play/osu/approachcircle@2x"); 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) protected override void UpdateState(ArmedState state)
{ {
if (!IsLoaded) return; if (!IsLoaded) return;
Flush(); //move to DrawableHitObject Flush(true); //move to DrawableHitObject
Transforms.Add(new TransformAlpha { StartTime = h.StartTime - 1000, EndTime = h.StartTime - 800, StartValue = 0, EndValue = 1 }); double t = HitTime ?? h.StartTime;
approachCircle.Transforms.Add(new TransformScale { StartTime = h.StartTime - 1000, EndTime = h.StartTime, StartValue = new Vector2(2f), EndValue = new Vector2(0.6f) }); //sane defaults
approachCircle.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime, StartValue = 1, EndValue = 0 }); ring.Alpha = circle.Alpha = number.Alpha = approachCircle.Alpha = glow.Alpha = 1;
explode.Alpha = 0;
Scale = Vector2.One;
glow.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = glow.Alpha, EndValue = 0 }); //always-present transforms
Transforms.Add(new TransformAlpha { StartTime = t - 1000, EndTime = t - 800, StartValue = 0, EndValue = 1 });
approachCircle.Transforms.Add(new TransformScale { StartTime = t - 1000, EndTime = t, StartValue = new Vector2(2f), EndValue = new Vector2(0.6f) });
//set transform delay to t==hitTime
Delay(t - Time, true);
approachCircle.FadeOut();
glow.FadeOut(400);
switch (state) switch (state)
{ {
case ArmedState.Disarmed: case ArmedState.Disarmed:
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 }); Delay(h.Duration + 200);
FadeOut(200);
break; break;
case ArmedState.Armed: case ArmedState.Armed:
const float flashIn = 30; const double flash_in = 30;
const float fadeOut = 800;
//Transforms.Add(new TransformScale() { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = Scale, EndValue = Scale * 1.1f }); flash.FadeTo(0.8f, flash_in);
flash.Delay(flash_in);
flash.FadeOut(100);
ring.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 }); explode.FadeIn(flash_in);
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 });
flash.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0.8f }); Delay(flash_in, true);
flash.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + 100, StartValue = 0.8f, EndValue = 0 });
explode.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 1 }); //after the flash, we can hide some elements that were behind it
ring.FadeOut();
circle.FadeOut();
number.FadeOut();
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + fadeOut, StartValue = 1, EndValue = 0 }); FadeOut(800);
ScaleTo(Scale * 1.5f, 400, EasingTypes.OutQuad);
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; break;
} }
} }
class NumberPart : Container private class NumberLayer : Container
{ {
private Sprite number; private Sprite number;
public NumberPart() public NumberLayer()
{ {
Anchor = Anchor.Centre; Anchor = Anchor.Centre;
Origin = Anchor.Centre; Origin = Anchor.Centre;
Children = new[] Children = new[]
{ {
number = new Sprite number = new Sprite
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
Alpha = 1, Alpha = 1
} }
}; };
} }
@ -138,39 +156,39 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
} }
} }
class GlowPart : Container private class GlowLayer : Container
{ {
private Sprite layer3; private Sprite layer;
public GlowPart() public GlowLayer()
{ {
Anchor = Anchor.Centre; Anchor = Anchor.Centre;
Origin = Anchor.Centre; Origin = Anchor.Centre;
Children = new[] Children = new[]
{ {
layer3 = new Sprite layer = new Sprite
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
Additive = true, BlendingMode = BlendingMode.Additive,
Alpha = 0.5f, Alpha = 0.5f
} }
}; };
} }
protected override void Load(BaseGame game) protected override void Load(BaseGame game)
{ {
base.Load(game); base.Load(game);
layer3.Texture = game.Textures.Get(@"Play/osu/ring-glow@2x"); layer.Texture = game.Textures.Get(@"Play/osu/ring-glow@2x");
} }
} }
class RingPart : Container private class RingLayer : Container
{ {
private Sprite ring; private Sprite ring;
public RingPart() public RingLayer()
{ {
Anchor = Anchor.Centre; Anchor = Anchor.Centre;
Origin = Anchor.Centre; Origin = Anchor.Centre;
@ -180,8 +198,8 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
ring = new Sprite ring = new Sprite
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre
}, }
}; };
} }
@ -192,93 +210,62 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
} }
} }
class FlashPart : Container private class FlashLayer : Container
{ {
public FlashPart() public FlashLayer()
{ {
Size = new Vector2(144); Size = new Vector2(144);
Masking = true; Masking = true;
CornerRadius = Size.X / 2; CornerRadius = Size.X / 2;
Anchor = Anchor.Centre; Anchor = Anchor.Centre;
Origin = Anchor.Centre; Origin = Anchor.Centre;
Additive = true; BlendingMode = BlendingMode.Additive;
Alpha = 0; Alpha = 0;
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
{ {
new Box new Box
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both
} }
}; };
} }
} }
class ExplodePart : Container private class ExplodeLayer : Container
{ {
public ExplodePart() public ExplodeLayer()
{ {
Size = new Vector2(144); Size = new Vector2(144);
Anchor = Anchor.Centre; Anchor = Anchor.Centre;
Origin = Anchor.Centre; Origin = Anchor.Centre;
Additive = true; BlendingMode = BlendingMode.Additive;
Alpha = 0; Alpha = 0;
Children = new Framework.Graphics.Drawable[] Children = new Framework.Graphics.Drawable[]
{ {
new Triangles new Triangles
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both
},
};
}
class Triangles : Container
{
private Texture tex;
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),
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)));
}
} }
} }
class CirclePart : Container private class CircleLayer : Container
{ {
private Sprite disc; private Sprite disc;
private Triangles triangles; private Triangles triangles;
public Action Hit; public Func<bool> Hit;
public CirclePart() public CircleLayer()
{ {
Size = new Vector2(144); Size = new Vector2(144);
Masking = true; Masking = true;
@ -292,13 +279,13 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
disc = new Sprite disc = new Sprite
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre
}, },
triangles = new Triangles triangles = new Triangles
{ {
Additive = true, BlendingMode = BlendingMode.Additive,
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both
}, }
}; };
} }
@ -313,37 +300,38 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
Hit?.Invoke(); Hit?.Invoke();
return true; return true;
} }
}
class Triangles : Container private class Triangles : Container
{
private Texture tex;
protected override void Load(BaseGame game)
{ {
private Texture tex; base.Load(game);
protected override void Load(BaseGame game) tex = game.Textures.Get(@"Play/osu/triangle@2x");
for (int i = 0; i < 10; i++)
{ {
base.Load(game); Add(new Sprite
tex = game.Textures.Get(@"Play/osu/triangle@2x");
for (int i = 0; i < 10; i++)
{ {
Add(new Sprite Texture = tex,
{ Origin = Anchor.Centre,
Texture = tex, RelativePositionAxes = Axes.Both,
Origin = Anchor.Centre, Position = new Vector2(RNG.NextSingle(), RNG.NextSingle()),
Position = new Vector2(RNG.NextSingle() * DrawSize.X, RNG.NextSingle() * DrawSize.Y), Scale = new Vector2(RNG.NextSingle() * 0.4f + 0.2f),
Scale = new Vector2(RNG.NextSingle() * 0.4f + 0.2f), Alpha = RNG.NextSingle() * 0.3f
Alpha = RNG.NextSingle() * 0.3f, });
});
}
} }
}
protected override void Update() protected override void Update()
{ {
base.Update(); base.Update();
foreach (Framework.Graphics.Drawable d in Children) foreach (Framework.Graphics.Drawable d in Children)
d.Position -= new Vector2(0, (float)(d.Scale.X * (Clock.ElapsedFrameTime / 20))); d.Position -= new Vector2(0, (float)(d.Scale.X * (Clock.ElapsedFrameTime / 2880)));
}
} }
} }
} }

View File

@ -10,7 +10,6 @@ namespace osu.Game.Beatmaps.Objects.Osu
public abstract class OsuBaseHit : HitObject public abstract class OsuBaseHit : HitObject
{ {
public Vector2 Position { get; set; } public Vector2 Position { get; set; }
public bool NewCombo { get; set; }
[Flags] [Flags]
private enum HitObjectType private enum HitObjectType

View File

@ -13,6 +13,11 @@ namespace osu.Game.Beatmaps.Timing
{ {
public double BeatLength; public double BeatLength;
public TimingChange(double beatLength)
{
BeatLength = beatLength;
}
public double BPM => 60000 / BeatLength; public double BPM => 60000 / BeatLength;
} }
} }

View File

@ -4,6 +4,7 @@
using System; using System;
using System.IO; using System.IO;
using osu.Framework.Audio.Track; using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
using osu.Game.Beatmaps.Formats; using osu.Game.Beatmaps.Formats;
using osu.Game.Beatmaps.IO; using osu.Game.Beatmaps.IO;
using osu.Game.Database; using osu.Game.Database;
@ -12,53 +13,92 @@ namespace osu.Game.Beatmaps
{ {
public class WorkingBeatmap : IDisposable public class WorkingBeatmap : IDisposable
{ {
public BeatmapInfo BeatmapInfo; public readonly BeatmapInfo BeatmapInfo;
public readonly ArchiveReader Reader; public readonly BeatmapSetInfo BeatmapSetInfo;
private readonly BeatmapDatabase database;
private ArchiveReader reader => database.GetReader(BeatmapSetInfo);
private Texture background;
private object backgroundLock = new object();
public Texture Background
{
get
{
lock (backgroundLock)
{
if (background != null) return background;
try
{
background = new TextureStore(new RawTextureLoaderStore(reader)).Get(BeatmapInfo.Metadata.BackgroundFile);
}
catch { }
return background;
}
}
set { lock (backgroundLock) background = value; }
}
private Beatmap beatmap; private Beatmap beatmap;
private object beatmapLock = new object();
public Beatmap Beatmap public Beatmap Beatmap
{ {
get get
{ {
if (beatmap != null) return beatmap; lock (beatmapLock)
try
{ {
using (var stream = new StreamReader(Reader.ReadFile(BeatmapInfo.Path))) if (beatmap != null) return beatmap;
beatmap = BeatmapDecoder.GetDecoder(stream)?.Decode(stream);
}
catch { }
return beatmap; try
{
using (var stream = new StreamReader(reader.GetStream(BeatmapInfo.Path)))
beatmap = BeatmapDecoder.GetDecoder(stream)?.Decode(stream);
}
catch { }
return beatmap;
}
} }
set { beatmap = value; } set { lock (beatmapLock) beatmap = value; }
} }
private AudioTrack track; private AudioTrack track;
private object trackLock = new object();
public AudioTrack Track public AudioTrack Track
{ {
get get
{ {
if (track != null) return track; lock (trackLock)
try
{ {
var trackData = Reader.ReadFile(BeatmapInfo.Metadata.AudioFile); if (track != null) return track;
if (trackData != null)
track = new AudioTrackBass(trackData);
}
catch { }
return track; try
{
var trackData = reader.GetStream(BeatmapInfo.Metadata.AudioFile);
if (trackData != null)
track = new AudioTrackBass(trackData);
}
catch { }
return track;
}
} }
set { track = value; } set { lock (trackLock) track = value; }
} }
public WorkingBeatmap(BeatmapInfo beatmapInfo = null, ArchiveReader reader = null) public WorkingBeatmap(Beatmap beatmap)
{
this.beatmap = beatmap;
}
public WorkingBeatmap(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo, BeatmapDatabase database)
{ {
this.BeatmapInfo = beatmapInfo; this.BeatmapInfo = beatmapInfo;
Reader = reader; this.BeatmapSetInfo = beatmapSetInfo;
this.database = database;
} }
private bool isDisposed; private bool isDisposed;
@ -68,7 +108,7 @@ namespace osu.Game.Beatmaps
if (!isDisposed) if (!isDisposed)
{ {
track?.Dispose(); track?.Dispose();
Reader?.Dispose(); reader?.Dispose();
isDisposed = true; isDisposed = true;
} }
} }

View File

@ -95,7 +95,7 @@ namespace osu.Game.Database
string[] mapNames = reader.ReadBeatmaps(); string[] mapNames = reader.ReadBeatmaps();
foreach (var name in mapNames) foreach (var name in mapNames)
{ {
using (var stream = new StreamReader(reader.ReadFile(name))) using (var stream = new StreamReader(reader.GetStream(name)))
{ {
var decoder = BeatmapDecoder.GetDecoder(stream); var decoder = BeatmapDecoder.GetDecoder(stream);
Beatmap beatmap = decoder.Decode(stream); Beatmap beatmap = decoder.Decode(stream);
@ -149,12 +149,10 @@ namespace osu.Game.Database
if (beatmapSetInfo == null) if (beatmapSetInfo == null)
throw new InvalidOperationException($@"Beatmap set {beatmapInfo.BeatmapSetID} is not in the local database."); throw new InvalidOperationException($@"Beatmap set {beatmapInfo.BeatmapSetID} is not in the local database.");
var reader = GetReader(beatmapSetInfo);
if (beatmapInfo.Metadata == null) if (beatmapInfo.Metadata == null)
beatmapInfo.Metadata = beatmapSetInfo.Metadata; beatmapInfo.Metadata = beatmapSetInfo.Metadata;
var working = new WorkingBeatmap(beatmapInfo, reader); var working = new WorkingBeatmap(beatmapInfo, beatmapSetInfo, this);
previous?.TransferTo(working); previous?.TransferTo(working);

View File

@ -91,7 +91,7 @@ namespace osu.Game.GameModes
Origin = Anchor.Centre, Origin = Anchor.Centre,
Colour = getColourFor(GetType()), Colour = getColourFor(GetType()),
Alpha = 1, Alpha = 1,
Additive = false BlendingMode = BlendingMode.Additive,
}, },
textContainer = new Container textContainer = new Container
{ {

View File

@ -35,7 +35,7 @@ namespace osu.Game.GameModes.Menu
logo = new OsuLogo() logo = new OsuLogo()
{ {
Alpha = 0, Alpha = 0,
Additive = true, BlendingMode = BlendingMode.Additive,
Interactive = false, Interactive = false,
Colour = Color4.DarkGray, Colour = Color4.DarkGray,
Ripple = false Ripple = false

View File

@ -83,7 +83,7 @@ namespace osu.Game.GameModes.Menu
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
Additive = true, BlendingMode = BlendingMode.Additive,
Alpha = 0.05f Alpha = 0.05f
} }
} }
@ -93,7 +93,7 @@ namespace osu.Game.GameModes.Menu
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
Size = logo.Size, Size = logo.Size,
Additive = true, BlendingMode = BlendingMode.Additive,
Alpha = 0.2f, Alpha = 0.2f,
} }
} }

View File

@ -7,6 +7,7 @@ using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects;
using osu.Framework; using osu.Framework;
using System; using System;
using System.Linq;
namespace osu.Game.GameModes.Play namespace osu.Game.GameModes.Play
{ {
@ -14,6 +15,10 @@ namespace osu.Game.GameModes.Play
{ {
public Action<HitObject> OnHit; public Action<HitObject> OnHit;
public Action<HitObject> OnMiss; public Action<HitObject> OnMiss;
protected Playfield Playfield;
public IEnumerable<DrawableHitObject> DrawableObjects => Playfield.Children.Cast<DrawableHitObject>();
} }
public abstract class HitRenderer<T> : HitRenderer public abstract class HitRenderer<T> : HitRenderer
@ -31,8 +36,6 @@ namespace osu.Game.GameModes.Play
} }
} }
private Playfield playfield;
protected abstract Playfield CreatePlayfield(); protected abstract Playfield CreatePlayfield();
protected abstract HitObjectConverter<T> Converter { get; } protected abstract HitObjectConverter<T> Converter { get; }
@ -47,7 +50,7 @@ namespace osu.Game.GameModes.Play
Children = new Drawable[] Children = new Drawable[]
{ {
playfield = CreatePlayfield() Playfield = CreatePlayfield()
}; };
loadObjects(); loadObjects();
@ -65,7 +68,7 @@ namespace osu.Game.GameModes.Play
drawableObject.OnHit = onHit; drawableObject.OnHit = onHit;
drawableObject.OnMiss = onMiss; drawableObject.OnMiss = onMiss;
playfield.Add(drawableObject); Playfield.Add(drawableObject);
} }
} }

View File

@ -12,26 +12,48 @@ namespace osu.Game.GameModes.Play.Osu
{ {
public class OsuPlayfield : Playfield public class OsuPlayfield : Playfield
{ {
public OsuPlayfield() protected override Container Content => hitObjectContainer;
private Container hitObjectContainer;
public override Vector2 Size
{ {
Size = new Vector2(512, 384); get
Scale = new Vector2(1.6f); {
Anchor = Anchor.Centre; var parentSize = Parent.DrawSize;
Origin = Anchor.Centre; var aspectSize = parentSize.X * 0.75f < parentSize.Y ? new Vector2(parentSize.X, parentSize.X * 0.75f) : new Vector2(parentSize.Y * 4f / 3f, parentSize.Y);
return new Vector2(aspectSize.X / parentSize.X, aspectSize.Y / parentSize.Y) * base.Size;
}
} }
protected override void Load(BaseGame game) public OsuPlayfield()
{ {
base.Load(game); Anchor = Anchor.Centre;
Origin = Anchor.Centre;
RelativeSizeAxes = Axes.Both;
Size = new Vector2(0.75f);
Add(new Box() AddInternal(new Box
{ {
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
Colour = Color4.Black, Colour = Color4.Black,
Alpha = 0.5f Alpha = 0.5f,
}); });
AddInternal(hitObjectContainer = new HitObjectContainer
{
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
});
}
class HitObjectContainer : Container
{
protected override Vector2 ChildScale => new Vector2(0.625f);
} }
} }
} }

View File

@ -240,7 +240,10 @@ namespace osu.Game.GameModes.Play
beatmapSet = database.GetWithChildren<BeatmapSetInfo>(beatmapSet.BeatmapSetID); beatmapSet = database.GetWithChildren<BeatmapSetInfo>(beatmapSet.BeatmapSetID);
beatmapSet.Beatmaps.ForEach(b => database.GetChildren(b)); beatmapSet.Beatmaps.ForEach(b => database.GetChildren(b));
beatmapSet.Beatmaps = beatmapSet.Beatmaps.OrderBy(b => b.BaseDifficulty.OverallDifficulty).ToList(); beatmapSet.Beatmaps = beatmapSet.Beatmaps.OrderBy(b => b.BaseDifficulty.OverallDifficulty).ToList();
var group = new BeatmapGroup(beatmapSet) { SelectionChanged = selectionChanged };
var working = database.GetWorkingBeatmap(beatmapSet.Beatmaps.FirstOrDefault());
var group = new BeatmapGroup(beatmapSet, working) { SelectionChanged = selectionChanged };
group.Preload(Game, g => group.Preload(Game, g =>
{ {

View File

@ -2,7 +2,6 @@
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE //Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Objects; using osu.Game.Beatmaps.Objects;
using osu.Game.GameModes.Backgrounds; using osu.Game.GameModes.Backgrounds;
using osu.Game.GameModes.Play.Catch; using osu.Game.GameModes.Play.Catch;
@ -12,13 +11,15 @@ using osu.Game.GameModes.Play.Taiko;
using osu.Framework; using osu.Framework;
using osu.Game.Database; using osu.Game.Database;
using osu.Framework.Timing; using osu.Framework.Timing;
using osu.Framework.GameModes;
using osu.Framework.Audio.Track; using osu.Framework.Audio.Track;
using osu.Framework.Extensions.IEnumerableExtensions;
namespace osu.Game.GameModes.Play namespace osu.Game.GameModes.Play
{ {
public class Player : OsuGameMode public class Player : OsuGameMode
{ {
const bool autoplay = false;
protected override BackgroundMode CreateBackground() => new BackgroundModeCustom(@"Backgrounds/bg4"); protected override BackgroundMode CreateBackground() => new BackgroundModeCustom(@"Backgrounds/bg4");
public BeatmapInfo BeatmapInfo; public BeatmapInfo BeatmapInfo;
@ -124,6 +125,9 @@ namespace osu.Game.GameModes.Play
hitRenderer.OnHit += delegate (HitObject h) { scoreOverlay.OnHit(h); }; hitRenderer.OnHit += delegate (HitObject h) { scoreOverlay.OnHit(h); };
hitRenderer.OnMiss += delegate (HitObject h) { scoreOverlay.OnMiss(h); }; hitRenderer.OnMiss += delegate (HitObject h) { scoreOverlay.OnMiss(h); };
if (autoplay)
hitRenderer.Schedule(() => hitRenderer.DrawableObjects.ForEach(h => h.State = ArmedState.Armed));
Children = new Drawable[] Children = new Drawable[]
{ {
hitRenderer, hitRenderer,

View File

@ -10,7 +10,6 @@ using OpenTK.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework; using osu.Framework;
using System.Threading.Tasks; using System.Threading.Tasks;
using osu.Framework.Graphics.Textures;
namespace osu.Game.Graphics.Background namespace osu.Game.Graphics.Background
{ {
@ -27,8 +26,6 @@ namespace osu.Game.Graphics.Background
Depth = float.MinValue; Depth = float.MinValue;
} }
Texture texture;
protected override void Load(BaseGame game) protected override void Load(BaseGame game)
{ {
base.Load(game); base.Load(game);

View File

@ -64,9 +64,21 @@ namespace osu.Game
//this completely overrides the framework default. will need to change once we make a proper FontStore. //this completely overrides the framework default. will need to change once we make a proper FontStore.
Fonts = new TextureStore() { ScaleAdjust = 0.01f }; Fonts = new TextureStore() { ScaleAdjust = 0.01f };
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-Regular"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/FontAwesome")); Fonts.AddStore(new GlyphStore(Resources, @"Fonts/FontAwesome"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/osuFont")); Fonts.AddStore(new GlyphStore(Resources, @"Fonts/osuFont"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-Regular"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-RegularItalic"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-SemiBold"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-SemiBoldItalic"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-Bold"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-BoldItalic"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-Light"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-LightItalic"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-Medium"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-MediumItalic"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-Black"));
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Exo2.0-BlackItalic"));
API = new APIAccess() API = new APIAccess()
{ {

View File

@ -44,7 +44,7 @@ namespace osu.Game.Overlays
new ScrollContainer new ScrollContainer
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
ScrollDraggerOnLeft = true, ScrollDraggerAnchor = Anchor.TopLeft,
Children = new[] Children = new[]
{ {
new FlowContainer new FlowContainer

View File

@ -66,7 +66,7 @@ namespace osu.Game.Overlays
HoverBackground = new Box HoverBackground = new Box
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Additive = true, BlendingMode = BlendingMode.Additive,
Colour = new Color4(60, 60, 60, 255), Colour = new Color4(60, 60, 60, 255),
Alpha = 0, Alpha = 0,
}, },

View File

@ -66,6 +66,7 @@
<Compile Include="Overlays\DragBar.cs" /> <Compile Include="Overlays\DragBar.cs" />
<Compile Include="Overlays\MusicController.cs" /> <Compile Include="Overlays\MusicController.cs" />
<Compile Include="Beatmaps\Beatmap.cs" /> <Compile Include="Beatmaps\Beatmap.cs" />
<Compile Include="Beatmaps\Formats\ConstructableBeatmapDecoder.cs" />
<Compile Include="Beatmaps\WorkingBeatmap.cs" /> <Compile Include="Beatmaps\WorkingBeatmap.cs" />
<Compile Include="Beatmaps\Drawable\BeatmapSetHeader.cs" /> <Compile Include="Beatmaps\Drawable\BeatmapSetHeader.cs" />
<Compile Include="Beatmaps\Drawable\DifficultyIcon.cs" /> <Compile Include="Beatmaps\Drawable\DifficultyIcon.cs" />