避免按下多个键

时间:2014-01-01 01:56:05

标签: c# xna keyboard key

我有

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;
}

好吧,我遇到了问题。发生的事情是:

  1. 只需点击字母 A 一次输出3 a。
  2. 当按下两个按钮时, A B ,第一个问题发生了,abababababab只是在我按住它时不断重复。
  3. 如果我解决了第一个问题,我不确定第二个问题是否会解决 任何人都可以修复我的代码或推荐修复吗?或者至少找到问题?

2 个答案:

答案 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;

不是在我的电脑上,所以可能使用了错误的方法名称,但是你得到了图片!