91 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
    }
 | 
						|
}
 |