91 lines
3.4 KiB
C#

using System.Collections.Generic;
using Microsoft.Xna.Framework.Input.Touch;
using Engine.Core;
using Engine.Systems.Input;
using MyUniverse.Shared.Behaviours.Abstract;
namespace MyUniverse.Platforms.Android;
public class MobileInputs : Behaviour, IUpdate, IGameInputs
{
public IButtonInputs<IGameInputs.Button>.InputEvent OnAnyButtonPressed { get; } = new();
public IButtonInputs<IGameInputs.Button>.InputEvent OnAnyButtonReleased { get; } = new();
private readonly Dictionary<IGameInputs.Button, IButtonInputs<IGameInputs.Button>.InputEvent> OnPressed = new(256);
private readonly Dictionary<IGameInputs.Button, IButtonInputs<IGameInputs.Button>.InputEvent> OnReleased = new(256);
private TouchCollection touchCollection = default;
public void RegisterOnPress(IGameInputs.Button key, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
{
if (OnPressed.TryGetValue(key, out IButtonInputs<IGameInputs.Button>.InputEvent @event))
{
@event.AddListener(callback);
return;
}
@event = new();
@event.AddListener(callback);
OnPressed.Add(key, @event);
}
public void UnregisterOnPress(IGameInputs.Button key, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
{
if (OnPressed.TryGetValue(key, out IButtonInputs<IGameInputs.Button>.InputEvent @event))
@event.RemoveListener(callback);
}
public void RegisterOnRelease(IGameInputs.Button key, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
{
if (OnReleased.TryGetValue(key, out IButtonInputs<IGameInputs.Button>.InputEvent @event))
{
@event.AddListener(callback);
return;
}
@event = new();
@event.AddListener(callback);
OnReleased.Add(key, @event);
}
public void UnregisterOnRelease(IGameInputs.Button key, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
{
if (OnReleased.TryGetValue(key, out IButtonInputs<IGameInputs.Button>.InputEvent @event))
@event.RemoveListener(callback);
}
public void Update()
{
touchCollection = TouchPanel.GetState();
if (touchCollection.Count > 0)
{
TouchLocation touchLocation = touchCollection[(int)IGameInputs.Button.Interact];
if (touchLocation.State == TouchLocationState.Pressed)
{
if (OnPressed.TryGetValue(IGameInputs.Button.Interact, out IButtonInputs<IGameInputs.Button>.InputEvent @event))
@event.Invoke(this, new(IGameInputs.Button.Interact));
OnAnyButtonPressed?.Invoke(this, new(IGameInputs.Button.Interact));
}
else if (touchLocation.State == TouchLocationState.Released)
{
if (OnReleased.TryGetValue(IGameInputs.Button.Interact, out IButtonInputs<IGameInputs.Button>.InputEvent @event))
@event.Invoke(this, new(IGameInputs.Button.Interact));
OnAnyButtonReleased?.Invoke(this, new(IGameInputs.Button.Interact));
}
}
}
public bool IsPressed(IGameInputs.Button button)
{
if (touchCollection.Count > 0)
return false;
TouchLocation touchLocation = touchCollection[(int)IGameInputs.Button.Interact];
return touchLocation.State == TouchLocationState.Pressed || touchLocation.State == TouchLocationState.Moved;
}
}