feat: added IGameInputs
This commit is contained in:
		
							
								
								
									
										2
									
								
								Engine
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								Engine
									
									
									
									
									
								
							 Submodule Engine updated: d78c42a653...efed24de20
									
								
							
							
								
								
									
										133
									
								
								Platforms/Desktop/DesktopInputs.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								Platforms/Desktop/DesktopInputs.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
using Microsoft.Xna.Framework.Input;
 | 
			
		||||
 | 
			
		||||
using Engine.Core;
 | 
			
		||||
using Engine.Integration.MonoGame;
 | 
			
		||||
using Engine.Systems.Input;
 | 
			
		||||
 | 
			
		||||
using MyUniverse.Shared.Behaviours.Abstract;
 | 
			
		||||
 | 
			
		||||
public class DesktopInputs : BehaviourBase, IEnterUniverse, IExitUniverse, 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 readonly Dictionary<IGameInputs.Button, Keys> keyMappingReversed = [];
 | 
			
		||||
    private readonly Dictionary<Keys, IGameInputs.Button> keyMapping = new() {
 | 
			
		||||
        { Keys.Space, IGameInputs.Button.Interact }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private KeyboardInputs keyboardInputs = null!;
 | 
			
		||||
 | 
			
		||||
    public void EnterUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        keyboardInputs = BehaviourController.GetOrAddBehaviour<KeyboardInputs>();
 | 
			
		||||
        keyboardInputs.OnAnyButtonPressed.AddListener(AnyPressCallback);
 | 
			
		||||
        keyboardInputs.OnAnyButtonReleased.AddListener(AnyReleaseCallback);
 | 
			
		||||
 | 
			
		||||
        foreach ((Keys key, IGameInputs.Button button) in keyMapping)
 | 
			
		||||
            keyboardInputs.RegisterOnPress(key, PressCallback);
 | 
			
		||||
 | 
			
		||||
        foreach ((Keys key, IGameInputs.Button button) in keyMapping)
 | 
			
		||||
            keyboardInputs.RegisterOnRelease(key, ReleaseCallback);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void ExitUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        keyboardInputs.OnAnyButtonPressed.RemoveListener(AnyPressCallback);
 | 
			
		||||
        keyboardInputs.OnAnyButtonReleased.RemoveListener(AnyReleaseCallback);
 | 
			
		||||
 | 
			
		||||
        foreach ((Keys key, IGameInputs.Button button) in keyMapping)
 | 
			
		||||
            keyboardInputs.UnregisterOnPress(key, PressCallback);
 | 
			
		||||
 | 
			
		||||
        foreach ((Keys key, IGameInputs.Button button) in keyMapping)
 | 
			
		||||
            keyboardInputs.UnregisterOnRelease(key, ReleaseCallback);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void PressCallback(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args)
 | 
			
		||||
    {
 | 
			
		||||
        if (!keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (!OnPressed.TryGetValue(button, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>? @event))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        @event.Invoke(this, new(button));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void ReleaseCallback(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args)
 | 
			
		||||
    {
 | 
			
		||||
        if (!keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (!OnReleased.TryGetValue(button, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>? @event))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        @event.Invoke(this, new(button));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void AnyReleaseCallback(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args)
 | 
			
		||||
    {
 | 
			
		||||
        if (keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
 | 
			
		||||
            OnAnyButtonPressed?.Invoke(this, new(button));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void AnyPressCallback(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args)
 | 
			
		||||
    {
 | 
			
		||||
        if (keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
 | 
			
		||||
            OnAnyButtonPressed?.Invoke(this, new(button));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void RegisterOnPress(IGameInputs.Button button, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
 | 
			
		||||
    {
 | 
			
		||||
        if (!OnPressed.TryGetValue(button, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>? @event))
 | 
			
		||||
        {
 | 
			
		||||
            @event = new();
 | 
			
		||||
            OnPressed.Add(button, @event);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @event.AddListener(callback);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void UnregisterOnPress(IGameInputs.Button button, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
 | 
			
		||||
    {
 | 
			
		||||
        if (OnPressed.TryGetValue(button, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>? @event))
 | 
			
		||||
            @event.RemoveListener(callback);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void RegisterOnRelease(IGameInputs.Button button, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
 | 
			
		||||
    {
 | 
			
		||||
        if (!OnReleased.TryGetValue(button, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>? @event))
 | 
			
		||||
        {
 | 
			
		||||
            @event = new();
 | 
			
		||||
            OnReleased.Add(button, @event);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @event.AddListener(callback);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void UnregisterOnRelease(IGameInputs.Button button, Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>.EventHandler callback)
 | 
			
		||||
    {
 | 
			
		||||
        if (OnReleased.TryGetValue(button, out Event<IButtonInputs<IGameInputs.Button>, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments>? @event))
 | 
			
		||||
            @event.RemoveListener(callback);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public bool IsPressed(IGameInputs.Button button)
 | 
			
		||||
    {
 | 
			
		||||
        if (!keyMappingReversed.TryGetValue(button, out Keys key))
 | 
			
		||||
            throw new($"{Enum.GetName(button)} is not mapped correctly");
 | 
			
		||||
 | 
			
		||||
        return keyboardInputs.IsPressed(key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DesktopInputs()
 | 
			
		||||
    {
 | 
			
		||||
        foreach ((Keys key, IGameInputs.Button button) in keyMapping)
 | 
			
		||||
            keyMappingReversed.Add(button, key);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -23,7 +23,7 @@ universe.InstantiateUniverseObject().SetUniverseObject("Logger")
 | 
			
		||||
    .BehaviourController.AddBehaviour<LoggerContainer>().Logger = ILogger.Shared = logger;
 | 
			
		||||
 | 
			
		||||
universe.InstantiateUniverseObject().SetUniverseObject("Desktop Inputs")
 | 
			
		||||
    .BehaviourController.AddBehaviour<KeyboardInputs>();
 | 
			
		||||
    .BehaviourController.AddBehaviour<DesktopInputs>();
 | 
			
		||||
 | 
			
		||||
universe.InstantiateUniverseObject().SetUniverseObject("Visual Managers")
 | 
			
		||||
    .BehaviourController.AddBehaviour<DrawManager>()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								Shared/Behaviours/Abstract/IGameInputs.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Shared/Behaviours/Abstract/IGameInputs.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
using Engine.Systems.Input;
 | 
			
		||||
 | 
			
		||||
namespace MyUniverse.Shared.Behaviours.Abstract;
 | 
			
		||||
 | 
			
		||||
public interface IGameInputs : IButtonInputs<IGameInputs.Button>
 | 
			
		||||
{
 | 
			
		||||
    public enum Button
 | 
			
		||||
    {
 | 
			
		||||
        Interact
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,31 +1,30 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Engine.Core;
 | 
			
		||||
using Engine.Integration.MonoGame;
 | 
			
		||||
using Engine.Systems.Input;
 | 
			
		||||
using Microsoft.Xna.Framework.Input;
 | 
			
		||||
 | 
			
		||||
using MyUniverse.Shared.Behaviours.Abstract;
 | 
			
		||||
 | 
			
		||||
namespace MyUniverse.Shared.Behaviours;
 | 
			
		||||
 | 
			
		||||
public class RotatorToggler : Behaviour2D, IFirstFrameUpdate, ILastFrameUpdate
 | 
			
		||||
{
 | 
			
		||||
    private IRotator rotator = null!;
 | 
			
		||||
    private KeyboardInputs inputs = null!;
 | 
			
		||||
    private IGameInputs inputs = null!;
 | 
			
		||||
 | 
			
		||||
    public void FirstActiveFrame()
 | 
			
		||||
    {
 | 
			
		||||
        rotator = BehaviourController.GetRequiredBehaviour<IRotator>();
 | 
			
		||||
        inputs = Universe.FindRequiredBehaviour<KeyboardInputs>();
 | 
			
		||||
        inputs = Universe.FindRequiredBehaviour<IGameInputs>();
 | 
			
		||||
 | 
			
		||||
        inputs.RegisterOnPress(Keys.Space, ToggleRotator);
 | 
			
		||||
        inputs.RegisterOnPress(IGameInputs.Button.Interact, ToggleRotator);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void ToggleRotator(IButtonInputs<Keys> sender, IButtonInputs<Keys>.ButtonCallbackArguments args)
 | 
			
		||||
    private void ToggleRotator(IButtonInputs<IGameInputs.Button> sender, IButtonInputs<IGameInputs.Button>.ButtonCallbackArguments args)
 | 
			
		||||
    {
 | 
			
		||||
        rotator.StateEnable.Enabled = !rotator.StateEnable.Enabled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void LastActiveFrame()
 | 
			
		||||
    {
 | 
			
		||||
        inputs.UnregisterOnPress(Keys.Space, ToggleRotator);
 | 
			
		||||
        inputs.UnregisterOnPress(IGameInputs.Button.Interact, ToggleRotator);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user