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