From 10ed6ef10d48339df8e8d83d4ffff6b824fee79b Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Tue, 21 Mar 2017 15:09:54 +0900 Subject: [PATCH] Move TaikoPlayfield to separate file. --- .../Tests/TestCaseTaikoPlayfield.cs | 22 ++ osu.Game.Modes.Taiko/UI/HitTarget.cs | 153 ++++++++++++++ osu.Game.Modes.Taiko/UI/InputDrum.cs | 142 +++++++++++++ osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs | 189 ++++++++++++++++-- .../osu.Game.Modes.Taiko.csproj | 2 + 5 files changed, 493 insertions(+), 15 deletions(-) create mode 100644 osu.Game.Modes.Taiko/UI/HitTarget.cs create mode 100644 osu.Game.Modes.Taiko/UI/InputDrum.cs diff --git a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs index 2ed38c84d5..3c801744e8 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseTaikoPlayfield.cs @@ -1 +1,23 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + using osu.Framework.Screens.Testing; +using osu.Game.Modes.Taiko.UI; + +namespace osu.Desktop.VisualTests.Tests +{ + internal class TestCaseTaikoPlayfield : TestCase + { + public override string Description => "Taiko playfield"; + + public override void Reset() + { + base.Reset(); + + Add(new TaikoPlayfield + { + Y = 200 + }); + } + } +} diff --git a/osu.Game.Modes.Taiko/UI/HitTarget.cs b/osu.Game.Modes.Taiko/UI/HitTarget.cs new file mode 100644 index 0000000000..b370f6f486 --- /dev/null +++ b/osu.Game.Modes.Taiko/UI/HitTarget.cs @@ -0,0 +1,153 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using OpenTK; +using OpenTK.Graphics; +using osu.Framework.Allocation; +using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; +using osu.Framework.Graphics.Transforms; +using osu.Game.Modes.Taiko.Objects; + +namespace osu.Game.Modes.Taiko.UI +{ + internal class HitTarget : Container + { + private Sprite outer; + private Sprite inner; + + private Container innerFlash; + private Container outerFlash; + + public HitTarget() + { + Children = new Drawable[] + { + new Box + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + + Size = new Vector2(5, TaikoPlayfield.PlayfieldHeight), + + Colour = Color4.Black + }, + new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + + Size = new Vector2(TaikoHitObject.CIRCLE_RADIUS * 2 * 1.5f), + Scale = new Vector2(TaikoPlayfield.PLAYFIELD_SCALE), + + Children = new Drawable[] + { + outer = new Sprite + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both, + }, + inner = new Sprite + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both, + Size = new Vector2(1 / 1.5f) + }, + new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both, + + Children = new Drawable[] + { + outerFlash = new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + + Size = new Vector2(TaikoHitObject.CIRCLE_RADIUS * 2 * 1.5f, 680), + + Masking = true, + CornerRadius = TaikoHitObject.CIRCLE_RADIUS * 2 * 1.5f, + + Alpha = 0, + + Children = new Drawable[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + + Alpha = 0, + AlwaysPresent = true + } + } + }, + innerFlash = new CircularContainer + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both, + + Masking = true, + + Alpha = 0, + + Children = new[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + + Colour = Color4.White.Opacity(0.85f), + } + }, + } + } + } + } + } + }; + } + + [BackgroundDependencyLoader] + private void load(TextureStore textures) + { + outer.Texture = textures.Get(@"Play/Taiko/taiko-drum-outer"); + inner.Texture = textures.Get(@"Play/Taiko/taiko-drum-inner"); + } + + public void Flash(Color4 colour) + { + innerFlash.EdgeEffect = new EdgeEffect + { + Type = EdgeEffectType.Glow, + Colour = colour, + Radius = 20 + }; + + outerFlash.EdgeEffect = new EdgeEffect + { + Type = EdgeEffectType.Glow, + Colour = colour, + Radius = 250 + }; + + outerFlash.FadeTo(0.3f, 125, EasingTypes.OutQuint); + outerFlash.Delay(125).FadeOut(125); + + innerFlash.FadeIn(); + innerFlash.FadeOut(250, EasingTypes.OutQuint); + } + } +} diff --git a/osu.Game.Modes.Taiko/UI/InputDrum.cs b/osu.Game.Modes.Taiko/UI/InputDrum.cs new file mode 100644 index 0000000000..59ab579a63 --- /dev/null +++ b/osu.Game.Modes.Taiko/UI/InputDrum.cs @@ -0,0 +1,142 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using OpenTK; +using OpenTK.Input; +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; +using osu.Framework.Graphics.Transforms; +using osu.Framework.Input; +using osu.Game.Graphics; +using System.Collections.Generic; + +namespace osu.Game.Modes.Taiko.UI +{ + internal class InputDrum : Container + { + public InputDrum() + { + Size = new Vector2(TaikoPlayfield.PlayfieldHeight); + + Children = new Drawable[] + { + new TaikoHalfDrum(false) + { + Anchor = Anchor.Centre, + Origin = Anchor.CentreRight, + + RelativeSizeAxes = Axes.Both, + + Keys = new List(new[] { Key.F, Key.D }) + }, + new TaikoHalfDrum(true) + { + Anchor = Anchor.Centre, + Origin = Anchor.CentreLeft, + + RelativeSizeAxes = Axes.Both, + + Position = new Vector2(-1f, 0), + + Keys = new List(new[] { Key.J, Key.K }) + } + }; + } + + private class TaikoHalfDrum : Container + { + /// + /// Keys[0] -> Inner key + /// Keys[0] -> Outer key + /// + public List Keys = new List(); + + private Sprite outer; + private Sprite outerHit; + private Sprite inner; + private Sprite innerHit; + + public TaikoHalfDrum(bool flipped) + { + Masking = true; + + Children = new Drawable[] + { + outer = new Sprite + { + Anchor = flipped ? Anchor.CentreLeft : Anchor.CentreRight, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both + }, + outerHit = new Sprite + { + Anchor = flipped ? Anchor.CentreLeft : Anchor.CentreRight, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both, + + Alpha = 0, + + BlendingMode = BlendingMode.Additive + }, + inner = new Sprite + { + Anchor = flipped ? Anchor.CentreLeft : Anchor.CentreRight, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both, + Size = new Vector2(0.7f) + }, + innerHit = new Sprite + { + Anchor = flipped ? Anchor.CentreLeft : Anchor.CentreRight, + Origin = Anchor.Centre, + + RelativeSizeAxes = Axes.Both, + Size = new Vector2(0.7f), + + Alpha = 0, + + BlendingMode = BlendingMode.Additive + } + }; + } + + [BackgroundDependencyLoader] + private void load(TextureStore textures, OsuColour colours) + { + outer.Texture = textures.Get(@"Play/Taiko/taiko-drum-outer"); + outerHit.Texture = textures.Get(@"Play/Taiko/taiko-drum-outer-hit"); + inner.Texture = textures.Get(@"Play/Taiko/taiko-drum-inner"); + innerHit.Texture = textures.Get(@"Play/Taiko/taiko-drum-inner-hit"); + + outerHit.Colour = colours.Blue; + innerHit.Colour = colours.Pink; + } + + protected override bool OnKeyDown(InputState state, KeyDownEventArgs args) + { + if (args.Repeat) + return false; + + if (args.Key == Keys[0]) + { + innerHit.FadeIn(); + innerHit.FadeOut(500, EasingTypes.OutQuint); + } + + if (args.Key == Keys[1]) + { + outerHit.FadeIn(); + outerHit.FadeOut(500, EasingTypes.OutQuint); + } + + return false; + } + } + } +} diff --git a/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs index f3ae600501..a40693fa89 100644 --- a/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs @@ -4,39 +4,198 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Sprites; -using osu.Framework.Graphics.Textures; using osu.Game.Modes.Taiko.Objects; using osu.Game.Modes.UI; using OpenTK; using OpenTK.Graphics; using osu.Game.Modes.Taiko.Judgements; +using osu.Game.Modes.Objects.Drawables; +using osu.Game.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Graphics.Primitives; namespace osu.Game.Modes.Taiko.UI { public class TaikoPlayfield : Playfield { + /// + /// The default play field height. + /// + public const float PLAYFIELD_BASE_HEIGHT = 242; + + /// + /// The play field height scale. + /// + public const float PLAYFIELD_SCALE = 0.65f; + + /// + /// The play field height after scaling. + /// + public static float PlayfieldHeight => PLAYFIELD_BASE_HEIGHT * PLAYFIELD_SCALE; + + /// + /// The offset from which the center of the hit target lies at. + /// + private const float hit_target_offset = 80; + + /// + /// The size of the left area of the playfield. This area contains the input drum. + /// + private const float left_area_size = 240; + + protected override Container Content => hitObjectContainer; + + private HitTarget hitTarget; + //private Container explosionRingContainer; + //private Container barLineContainer; + //private Container judgementContainer; + + private Container hitObjectContainer; + private Container topLevelHitContainer; + private Container leftBackgroundContainer; + private Container rightBackgroundContainer; + private Box leftBackground; + private Box rightBackground; + public TaikoPlayfield() { RelativeSizeAxes = Axes.X; - Size = new Vector2(1, 100); - Anchor = Anchor.Centre; - Origin = Anchor.Centre; + Height = PlayfieldHeight; + + AddInternal(new Drawable[] + { + rightBackgroundContainer = new Container + { + RelativeSizeAxes = Axes.Both, + BorderThickness = 2, + Masking = true, + EdgeEffect = new EdgeEffect + { + Type = EdgeEffectType.Shadow, + Colour = Color4.Black.Opacity(0.2f), + Radius = 5, + }, + Children = new Drawable[] + { + rightBackground = new Box + { + RelativeSizeAxes = Axes.Both, + Alpha = 0.6f + }, + } + }, + new Container + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Left = left_area_size }, + Children = new Drawable[] + { + new Container + { + Padding = new MarginPadding { Left = hit_target_offset }, + RelativeSizeAxes = Axes.Both, + Children = new Drawable[] + { + new Container + { + Name = @"Hit target", + RelativeSizeAxes = Axes.Both, + Children = new Drawable[] + { + //explosionRingContainer = new Container + //{ + // Anchor = Anchor.CentreLeft, + // Origin = Anchor.Centre, + // Size = new Vector2(TaikoHitObject.CIRCLE_RADIUS * 2), + // Scale = new Vector2(PLAYFIELD_SCALE), + // BlendingMode = BlendingMode.Additive + //}, + } + }, + //barLineContainer = new Container + //{ + // RelativeSizeAxes = Axes.Both, + //}, + hitTarget = new HitTarget + { + Anchor = Anchor.CentreLeft, + Origin = Anchor.Centre, + }, + hitObjectContainer = new Container + { + RelativeSizeAxes = Axes.Both, + }, + //judgementContainer = new Container + //{ + // RelativeSizeAxes = Axes.Both, + // BlendingMode = BlendingMode.Additive + //}, + }, + }, + } + }, + leftBackgroundContainer = new Container + { + Size = new Vector2(left_area_size, PlayfieldHeight), + BorderThickness = 1, + Children = new Drawable[] + { + leftBackground = new Box + { + RelativeSizeAxes = Axes.Both, + }, + new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativePositionAxes = Axes.X, + Position = new Vector2(0.10f, 0), + Children = new Drawable[] + { + new InputDrum + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Scale = new Vector2(0.9f) + }, + } + }, + new Box + { + Anchor = Anchor.TopRight, + RelativeSizeAxes = Axes.Y, + Width = 10, + ColourInfo = Framework.Graphics.Colour.ColourInfo.GradientHorizontal(Color4.Black.Opacity(0.6f), Color4.Black.Opacity(0)), + }, + } + }, + topLevelHitContainer = new Container + { + RelativeSizeAxes = Axes.Both, + } + }); } [BackgroundDependencyLoader] - private void load(TextureStore textures) + private void load(OsuColour colours) { - Add(new Box { RelativeSizeAxes = Axes.Both, Alpha = 0.5f }); + leftBackgroundContainer.BorderColour = colours.Gray0; + leftBackground.Colour = colours.Gray1; - Add(new Sprite - { - Texture = textures.Get(@"Menu/logo"), - Origin = Anchor.Centre, - Scale = new Vector2(0.2f), - RelativePositionAxes = Axes.Both, - Position = new Vector2(0.1f, 0.5f), - Colour = Color4.Gray - }); + rightBackgroundContainer.BorderColour = colours.Gray1; + rightBackground.Colour = colours.Gray0; + } + + public override void Add(DrawableHitObject h) + { + h.Depth = (float)h.HitObject.StartTime; + + base.Add(h); + } + + public override void OnJudgement(DrawableHitObject judgedObject) + { } } } \ No newline at end of file diff --git a/osu.Game.Modes.Taiko/osu.Game.Modes.Taiko.csproj b/osu.Game.Modes.Taiko/osu.Game.Modes.Taiko.csproj index 7ea6dfeadb..a4d87b096a 100644 --- a/osu.Game.Modes.Taiko/osu.Game.Modes.Taiko.csproj +++ b/osu.Game.Modes.Taiko/osu.Game.Modes.Taiko.csproj @@ -55,6 +55,8 @@ + +