91 lines
4.2 KiB
C#
91 lines
4.2 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 Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> OnAnyButtonPressed { get; } = new();
|
|
public Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> OnAnyButtonReleased { get; } = new();
|
|
|
|
private readonly Dictionary<IGameInputs.Button, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>> OnPressed = new(256);
|
|
private readonly Dictionary<IGameInputs.Button, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>> OnReleased = new(256);
|
|
|
|
private TouchCollection touchCollection = default;
|
|
|
|
public void RegisterOnPress(IGameInputs.Button key, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (OnPressed.TryGetValue(key, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> @event))
|
|
{
|
|
@event.AddListener(callback);
|
|
return;
|
|
}
|
|
|
|
@event = new();
|
|
@event.AddListener(callback);
|
|
OnPressed.Add(key, @event);
|
|
}
|
|
|
|
public void UnregisterOnPress(IGameInputs.Button key, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (OnPressed.TryGetValue(key, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> @event))
|
|
@event.RemoveListener(callback);
|
|
}
|
|
|
|
public void RegisterOnRelease(IGameInputs.Button key, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (OnReleased.TryGetValue(key, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> @event))
|
|
{
|
|
@event.AddListener(callback);
|
|
return;
|
|
}
|
|
|
|
@event = new();
|
|
@event.AddListener(callback);
|
|
OnReleased.Add(key, @event);
|
|
}
|
|
|
|
public void UnregisterOnRelease(IGameInputs.Button key, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (OnReleased.TryGetValue(key, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> @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 Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> @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 Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments> @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;
|
|
}
|
|
}
|