feat: added IGameInputs
This commit is contained in:
parent
9907aebe36
commit
182f96a16e
2
Engine
2
Engine
@ -1 +1 @@
|
||||
Subproject commit d78c42a65327a5889636da1a8d99e57513e20098
|
||||
Subproject commit efed24de2011eb9aad6fbeac38697eb9a7c37e3f
|
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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user