我有
var newkbState = Keyboard.GetState();
newkbState = GetKeysPressedBetween(oldkbState, newkbState);
Keys[] pressedKeys = newkbState.GetPressedKeys();
if (newkbState.IsKeyDown(Keys.LeftShift) || newkbState.IsKeyDown(Keys.RightShift))
{
shiftNew = true;
}
else
{
shiftNew = false;
}
newInput = "";
for (int count = 0; count < pressedKeys.Length; count++)
{
newInput += ConvertKeyToChar(pressedKeys[count], shiftNew);
}
if ((newInput != oldInput) && (newkbState != oldkbState))
{
text2 += newInput;
}
oldInput = newInput;
oldkbState = newkbState;
KeyboardState GetKeysPressedBetween(KeyboardState first, KeyboardState second)
{
KeyboardState pressed = new KeyboardState();
for (int i = 0; i < 8; i++)
{
FieldInfo currentStateI = typeof(KeyboardState).GetField("currentState" + i, BindingFlags.NonPublic | BindingFlags.Instance);
uint firstCurrentStateI = (uint)currentStateI.GetValue(first);
uint secondCurrentStateI = (uint)currentStateI.GetValue(second);
currentStateI.SetValueDirect(__makeref(pressed), ~firstCurrentStateI & secondCurrentStateI);
}
return pressed;
}
好吧,我遇到了问题。发生的事情是:
abababababab
只是在我按住它时不断重复。 如果我解决了第一个问题,我不确定第二个问题是否会解决 任何人都可以修复我的代码或推荐修复吗?或者至少找到问题?
答案 0 :(得分:0)
我能想到的第一件事是,只有在释放钥匙时才能检测到钥匙的压力,这样才能确保每个钥匙只被检测到一次。
或者您可以检测按键,然后停止使用布尔值“读取”它。释放键时,布尔值会改变状态。
答案 1 :(得分:0)
如果我理解正确,你只想检测新的按键;即当你按住 a 时,你只会对“a”做出反应,尽管你的代码会将其标记为每帧都被按下。
您应该在某处实施一个非常有用且简单的方法:
bool IsNewKeyPress(Keys key)
{
return oldInput.IsKeyUp(key) && newInput.IsKeyDown(key);
}
根据您放置它的位置,您可能还需要为该方法提供新的和旧的键盘状态。
用法也很简单。在您的方法中计算出Key[]
个新按键时,您需要枚举Key
中的每个newInput.GetPressedKeys()
,即:
List<Key> keys;
foreach (Key key in newInput.GetPressedKeys())
{
if (IsNewKeyPress(key))
keys.Add(key);
}
return keys.ToArray();
或者如果你喜欢LINQ:
var newKeys = input.GetPressedKeys();
Key[] keys = newKeys.Where(key => IsNewKeyPress(key)).ToArray();
return keys;
不是在我的电脑上,所以可能使用了错误的方法名称,但是你得到了图片!