2 Commits

3 changed files with 29 additions and 21 deletions

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Engine.Core; namespace Engine.Core;
@@ -23,6 +24,7 @@ public class UpdateManager : Behaviour
updateEntities.Assign(universe); updateEntities.Assign(universe);
postUpdateEntities.Assign(universe); postUpdateEntities.Assign(universe);
universe.OnPreUpdate.AddListener(OnFirstUpdate, int.MaxValue);
universe.OnPreUpdate.AddListener(OnPreUpdate); universe.OnPreUpdate.AddListener(OnPreUpdate);
universe.OnUpdate.AddListener(OnUpdate); universe.OnUpdate.AddListener(OnUpdate);
universe.OnPostUpdate.AddListener(OnPostUpdate); universe.OnPostUpdate.AddListener(OnPostUpdate);
@@ -36,19 +38,23 @@ public class UpdateManager : Behaviour
updateEntities.Unassign(); updateEntities.Unassign();
postUpdateEntities.Unassign(); postUpdateEntities.Unassign();
universe.OnPreUpdate.RemoveListener(OnFirstUpdate);
universe.OnPreUpdate.RemoveListener(OnPreUpdate); universe.OnPreUpdate.RemoveListener(OnPreUpdate);
universe.OnUpdate.RemoveListener(OnUpdate); universe.OnUpdate.RemoveListener(OnUpdate);
universe.OnPostUpdate.RemoveListener(OnPostUpdate); universe.OnPostUpdate.RemoveListener(OnPostUpdate);
} }
private void OnPreUpdate(IUniverse sender, IUniverse.UpdateArguments args) private void OnFirstUpdate(IUniverse sender, IUniverse.UpdateArguments args)
{ {
for (int i = toCallFirstFrameUpdates.Count - 1; i >= 0; i--) for (int i = toCallFirstFrameUpdates.Count - 1; i >= 0; i--)
{ {
toCallFirstFrameUpdates[i].FirstActiveFrame(); toCallFirstFrameUpdates[i].FirstActiveFrame();
toCallFirstFrameUpdates.RemoveAt(i); toCallFirstFrameUpdates.RemoveAt(i);
} }
}
private void OnPreUpdate(IUniverse sender, IUniverse.UpdateArguments args)
{
for (int i = preUpdateEntities.Count - 1; i >= 0; i--) for (int i = preUpdateEntities.Count - 1; i >= 0; i--)
preUpdateEntities[i].PreUpdate(); preUpdateEntities[i].PreUpdate();
} }

View File

@@ -10,11 +10,11 @@ namespace Engine.Integration.MonoGame;
public class KeyboardInputs : Behaviour, IButtonInputs<Keys>, IUpdate public class KeyboardInputs : Behaviour, IButtonInputs<Keys>, IUpdate
{ {
public Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments> OnAnyButtonPressed { get; } = new(); public IButtonInputs<Keys>.InputEvent OnAnyButtonPressed { get; } = new();
public Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments> OnAnyButtonReleased { get; } = new(); public IButtonInputs<Keys>.InputEvent OnAnyButtonReleased { get; } = new();
private readonly Dictionary<Keys, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>> OnPressed = new(256); private readonly Dictionary<Keys, IButtonInputs<Keys>.InputEvent> OnPressed = new(256);
private readonly Dictionary<Keys, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>> OnReleased = new(256); private readonly Dictionary<Keys, IButtonInputs<Keys>.InputEvent> OnReleased = new(256);
private int cachePressedCurrentlyCount = 0; private int cachePressedCurrentlyCount = 0;
private readonly Keys[] cachePressedCurrently = new Keys[256]; private readonly Keys[] cachePressedCurrently = new Keys[256];
@@ -22,9 +22,9 @@ public class KeyboardInputs : Behaviour, IButtonInputs<Keys>, IUpdate
private int cachePressedPreviouslyCount = 0; private int cachePressedPreviouslyCount = 0;
private readonly Keys[] cachePressedPreviously = new Keys[256]; private readonly Keys[] cachePressedPreviously = new Keys[256];
public void RegisterOnPress(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback) public void RegisterOnPress(Keys key, IButtonInputs<Keys>.InputEvent.EventHandler callback)
{ {
if (!OnPressed.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback)) if (!OnPressed.TryGetValue(key, out IButtonInputs<Keys>.InputEvent? delegateCallback))
{ {
delegateCallback = new(); delegateCallback = new();
OnPressed.Add(key, delegateCallback); OnPressed.Add(key, delegateCallback);
@@ -33,15 +33,15 @@ public class KeyboardInputs : Behaviour, IButtonInputs<Keys>, IUpdate
delegateCallback.AddListener(callback); delegateCallback.AddListener(callback);
} }
public void UnregisterOnPress(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback) public void UnregisterOnPress(Keys key, IButtonInputs<Keys>.InputEvent.EventHandler callback)
{ {
if (OnPressed.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback)) if (OnPressed.TryGetValue(key, out IButtonInputs<Keys>.InputEvent? delegateCallback))
delegateCallback.RemoveListener(callback); delegateCallback.RemoveListener(callback);
} }
public void RegisterOnRelease(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback) public void RegisterOnRelease(Keys key, IButtonInputs<Keys>.InputEvent.EventHandler callback)
{ {
if (!OnReleased.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback)) if (!OnReleased.TryGetValue(key, out IButtonInputs<Keys>.InputEvent? delegateCallback))
{ {
delegateCallback = new(); delegateCallback = new();
OnReleased.Add(key, delegateCallback); OnReleased.Add(key, delegateCallback);
@@ -50,9 +50,9 @@ public class KeyboardInputs : Behaviour, IButtonInputs<Keys>, IUpdate
delegateCallback.AddListener(callback); delegateCallback.AddListener(callback);
} }
public void UnregisterOnRelease(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback) public void UnregisterOnRelease(Keys key, IButtonInputs<Keys>.InputEvent.EventHandler callback)
{ {
if (OnReleased.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback)) if (OnReleased.TryGetValue(key, out IButtonInputs<Keys>.InputEvent? delegateCallback))
delegateCallback.RemoveListener(callback); delegateCallback.RemoveListener(callback);
} }
@@ -69,7 +69,7 @@ public class KeyboardInputs : Behaviour, IButtonInputs<Keys>, IUpdate
if (WasPressed(currentlyPressedKey)) if (WasPressed(currentlyPressedKey))
continue; continue;
if (OnPressed.TryGetValue(currentlyPressedKey, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? callback)) if (OnPressed.TryGetValue(currentlyPressedKey, out IButtonInputs<Keys>.InputEvent? callback))
callback?.Invoke(this, new(currentlyPressedKey)); callback?.Invoke(this, new(currentlyPressedKey));
OnAnyButtonPressed?.Invoke(this, new(currentlyPressedKey)); OnAnyButtonPressed?.Invoke(this, new(currentlyPressedKey));
@@ -82,7 +82,7 @@ public class KeyboardInputs : Behaviour, IButtonInputs<Keys>, IUpdate
if (IsPressed(previouslyPressedKey)) if (IsPressed(previouslyPressedKey))
continue; continue;
if (OnReleased.TryGetValue(previouslyPressedKey, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? callback)) if (OnReleased.TryGetValue(previouslyPressedKey, out IButtonInputs<Keys>.InputEvent? callback))
callback?.Invoke(this, new(previouslyPressedKey)); callback?.Invoke(this, new(previouslyPressedKey));
OnAnyButtonReleased?.Invoke(this, new(previouslyPressedKey)); OnAnyButtonReleased?.Invoke(this, new(previouslyPressedKey));

View File

@@ -4,15 +4,17 @@ namespace Engine.Systems.Input;
public interface IButtonInputs<T> : IHasStateEnable public interface IButtonInputs<T> : IHasStateEnable
{ {
Event<IButtonInputs<T>, ButtonCallbackArguments> OnAnyButtonPressed { get; } InputEvent OnAnyButtonPressed { get; }
Event<IButtonInputs<T>, ButtonCallbackArguments> OnAnyButtonReleased { get; } InputEvent OnAnyButtonReleased { get; }
void RegisterOnPress(T button, Event<IButtonInputs<T>, ButtonCallbackArguments>.EventHandler callback); void RegisterOnPress(T button, InputEvent.EventHandler callback);
void UnregisterOnPress(T button, Event<IButtonInputs<T>, ButtonCallbackArguments>.EventHandler callback); void UnregisterOnPress(T button, InputEvent.EventHandler callback);
void RegisterOnRelease(T button, Event<IButtonInputs<T>, ButtonCallbackArguments>.EventHandler callback); void RegisterOnRelease(T button, InputEvent.EventHandler callback);
void UnregisterOnRelease(T button, Event<IButtonInputs<T>, ButtonCallbackArguments>.EventHandler callback); void UnregisterOnRelease(T button, InputEvent.EventHandler callback);
bool IsPressed(T button); bool IsPressed(T button);
readonly record struct ButtonCallbackArguments(T Button); readonly record struct ButtonCallbackArguments(T Button);
class InputEvent : Event<IButtonInputs<T>, ButtonCallbackArguments>;
} }