mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 09:32:55 +08:00
Add bare minimum touch support to osu! ruleset
This commit is contained in:
parent
fd5fac507e
commit
b265888f18
@ -1,16 +1,17 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
using osu.Framework.Input.StateChanges.Events;
|
using osu.Framework.Input.StateChanges.Events;
|
||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
|
using osu.Game.Rulesets.Osu.UI;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu
|
namespace osu.Game.Rulesets.Osu
|
||||||
@ -45,6 +46,12 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
Add(new OsuTouchInputMapper(this) { RelativeSizeAxes = Axes.Both });
|
||||||
|
}
|
||||||
|
|
||||||
protected override bool Handle(UIEvent e)
|
protected override bool Handle(UIEvent e)
|
||||||
{
|
{
|
||||||
if ((e is MouseMoveEvent || e is TouchMoveEvent) && !AllowUserCursorMovement) return false;
|
if ((e is MouseMoveEvent || e is TouchMoveEvent) && !AllowUserCursorMovement) return false;
|
||||||
|
76
osu.Game.Rulesets.Osu/UI/OsuTouchInputMapper.cs
Normal file
76
osu.Game.Rulesets.Osu/UI/OsuTouchInputMapper.cs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
// 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.Input;
|
||||||
|
using osu.Framework.Input.Events;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.UI
|
||||||
|
{
|
||||||
|
public partial class OsuTouchInputMapper : Drawable
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This is our parent <see cref="osuInputManager"/>.
|
||||||
|
/// </summary>
|
||||||
|
private readonly OsuInputManager osuInputManager;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// All the active <see cref="TouchSource"/>s and the <see cref="OsuAction"/> that it triggered (if any).
|
||||||
|
/// Ordered from oldest to newest touch chronologically.
|
||||||
|
/// </summary>
|
||||||
|
private readonly List<TrackedTouch> trackedTouches = new List<TrackedTouch>();
|
||||||
|
|
||||||
|
public OsuTouchInputMapper(OsuInputManager inputManager)
|
||||||
|
{
|
||||||
|
osuInputManager = inputManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
private OsuAction? lastAction;
|
||||||
|
|
||||||
|
protected override bool OnTouchDown(TouchDownEvent e)
|
||||||
|
{
|
||||||
|
OsuAction action = lastAction == OsuAction.LeftButton && trackedTouches.Count > 0 ? OsuAction.RightButton : OsuAction.LeftButton;
|
||||||
|
|
||||||
|
if (trackedTouches.All(t => t.Action != action))
|
||||||
|
{
|
||||||
|
trackedTouches.Add(new TrackedTouch(e.Touch, action));
|
||||||
|
osuInputManager.KeyBindingContainer.TriggerPressed(action);
|
||||||
|
lastAction = action;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ignore any taps which trigger an action which is already handled. But track them for potential positional input in the future.
|
||||||
|
trackedTouches.Add(new TrackedTouch(e.Touch, null));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnTouchUp(TouchUpEvent e)
|
||||||
|
{
|
||||||
|
var tracked = trackedTouches.First(t => t.Touch.Source == e.Touch.Source);
|
||||||
|
|
||||||
|
if (tracked.Action is OsuAction action)
|
||||||
|
osuInputManager.KeyBindingContainer.TriggerReleased(action);
|
||||||
|
|
||||||
|
trackedTouches.Remove(tracked);
|
||||||
|
|
||||||
|
base.OnTouchUp(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TrackedTouch
|
||||||
|
{
|
||||||
|
public readonly Touch Touch;
|
||||||
|
|
||||||
|
public readonly OsuAction? Action;
|
||||||
|
|
||||||
|
public TrackedTouch(Touch touch, OsuAction? action)
|
||||||
|
{
|
||||||
|
Touch = touch;
|
||||||
|
Action = action;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user