feat: key history algorithm

This commit is contained in:
Gerard Gascón 2024-04-14 20:02:15 +02:00
parent 5d2da3ddbf
commit 1869a92580
8 changed files with 115 additions and 10 deletions

View file

@ -17,7 +17,5 @@ namespace Domain {
} }
public bool KeyDown(Type key) => _readers[key].KeyDown(); public bool KeyDown(Type key) => _readers[key].KeyDown();
public bool KeyPressed(Type key) => _readers[key].KeyPressed();
public bool KeyUp(Type key) => _readers[key].KeyUp();
} }
} }

View file

@ -0,0 +1,57 @@
using System.Collections.Generic;
using System.Linq;
namespace Domain.Input {
public class GeminadaReader : InputReader {
protected override int Key { get; } = 0x33;
private int LKey { get; } = 76;
private bool _lPressed;
private bool _lWasPressed;
private bool _dotPressed;
private bool _dotWasPressed;
private List<int> _lastPresses;
public override void UpdateInput() {
if (UpdateLInput()) {
if (_lastPresses.Count == 0) {
_lastPresses.Add(LKey);
} else if (_lastPresses.Count >= 2) {
if (_lastPresses[^1] == Key && _lastPresses[^2] == LKey) {
IsPressed = true;
}
}
}
UpdateDotInput();
}
private bool UpdateDotInput() {
_dotWasPressed = _dotPressed;
short dotState = Win32API.GetAsyncKeyState(Key);
if (!_dotWasPressed && dotState != 0) {
_dotPressed = true;
return true;
}
if (_dotPressed && dotState == 0) {
_dotPressed = false;
}
return false;
}
private bool UpdateLInput() {
_lWasPressed = _lPressed;
short lState = Win32API.GetAsyncKeyState(LKey);
if (!_lWasPressed && lState != 0) {
_lPressed = true;
return true;
}
if (_lPressed && lState == 0) {
_lPressed = false;
}
return false;
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 057b144441c443ccb0a24de75397b551
timeCreated: 1713114678

View file

@ -1,17 +1,15 @@
namespace Domain.Input { namespace Domain.Input {
public abstract class InputReader { public abstract class InputReader {
private bool _wasPressed; protected bool WasPressed;
private bool _isPressed; protected bool IsPressed;
protected abstract int Key { get; } protected abstract int Key { get; }
public void UpdateInput() { public virtual void UpdateInput() {
_wasPressed = _isPressed; WasPressed = IsPressed;
_isPressed = Win32API.GetAsyncKeyState(Key) != 0; IsPressed = Win32API.GetAsyncKeyState(Key) != 0;
} }
public bool KeyDown() => _isPressed && !_wasPressed; public bool KeyDown() => IsPressed && !WasPressed;
public bool KeyPressed() => _isPressed;
public bool KeyUp() => !_isPressed && _wasPressed;
} }
} }

View file

@ -0,0 +1,34 @@
using System.Collections.Generic;
namespace Domain {
public class KeyHistory {
private readonly List<int> _lastPresses = new();
private readonly List<int> _desiredSequence;
public KeyHistory(List<int> desiredSequence) {
_desiredSequence = desiredSequence;
}
public void KeyPressed(int key) => _lastPresses.Add(key);
public void ClearPressed() => _lastPresses.Clear();
public bool ContainsSequence() {
if (_lastPresses.Count < _desiredSequence.Count)
return false;
for (int i = 0; i < _lastPresses.Count; i++) {
if (i >= _desiredSequence.Count)
break;
int keyPressed = _lastPresses[_lastPresses.Count - 1 - i];
int sequenceKey = _desiredSequence[_desiredSequence.Count - 1 - i];
if (keyPressed != sequenceKey) {
return false;
}
}
return true;
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a63e60d016a84434ac8ae1855004239e
timeCreated: 1713116240

View file

@ -3,6 +3,7 @@
"com.sator-imaging.app-window-utility": "https://github.com/sator-imaging/AppWindowUtility.git", "com.sator-imaging.app-window-utility": "https://github.com/sator-imaging/AppWindowUtility.git",
"com.unity.2d.sprite": "1.0.0", "com.unity.2d.sprite": "1.0.0",
"com.unity.ide.rider": "3.0.28", "com.unity.ide.rider": "3.0.28",
"com.unity.test-framework": "1.1.33",
"com.unity.textmeshpro": "3.0.8", "com.unity.textmeshpro": "3.0.8",
"com.unity.ugui": "1.0.0", "com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0", "com.unity.modules.ai": "1.0.0",

View file

@ -29,6 +29,17 @@
}, },
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.test-framework": {
"version": "1.1.33",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.ext.nunit": "1.0.6",
"com.unity.modules.imgui": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0"
},
"url": "https://packages.unity.com"
},
"com.unity.textmeshpro": { "com.unity.textmeshpro": {
"version": "3.0.8", "version": "3.0.8",
"depth": 0, "depth": 0,