0

我正在尝试为播放器实现一种更改控件的方法,然后将该数据保存到文本文件中。

只有我的 InputManager 类使用 Xna.Input.Keys 枚举,其他所有获取键盘输入的内容都以字符串形式传递。InputManager 包含一个字典,键是从外部传入的动态字符串,值是 Input.Keys 枚举中的对应键。

所有这些都是从一个文件(keyconfig.cfg,只是一个标准文本文件)中加载的。
我尝试以各种方式修改代码,但我似乎无法让它正常工作。问题似乎来自我的这种特殊方法,它是 InputManager 的一部分:

public bool IsButtonPressed(string keyString)
    {
        if (keyState.IsKeyDown(KeyFromString(keyString)) && keyState_old.IsKeyUp(KeyFromString(keyString)))
           return true;
        return false;
    }
  • KeyFromString 将字符串转换为 Keys 类型
  • keyState 和 keyState_old 是 KeyboardState 实例(_old 是最后一帧的图像)
  • KeyboardState 实例通过 Update() 更新每一帧

我在 InputManager 的 Update() 中设置我的 keyState 和 keyState_old 变量,如下所示:

public void Update(GameTime gameTime)
{
    keyState = Keyboard.GetState();
    mouseState = Mouse.GetState();
    //Updates some other stuff within the class here, unrelated to keyboard input
    keyState_old = keyState;
}

我完全坚持这一点,如果有任何不清楚的地方,我深表歉意,我的英语不是最好的。提前致谢。

4

2 回答 2

0

在读取新状态之前分配 keyState_old 可能更安全,以避免覆盖它

public void Update(GameTime gameTime)
{
    keyState_old = keyState;  // Do this first

    keyState = Keyboard.GetState();  // Then this
    mouseState = Mouse.GetState();
    //Updates some other stuff within the class here, unrelated to keyboard input
}

否则,如果从 InputManager.Update 方法外部对 IsButtonPressed 进行调用,则当前和旧键状态将是相同的值

于 2013-07-02T10:13:56.557 回答
0
keyState = Keyboard.GetState();
keyState_old = keyState;

这就是你的问题。你得到新的状态,把它放进去keyState,然后你把它keyState放进去keyState_old……所以你有两个相同状态的副本。把这两行放在一起,而不是放在那块不相关的东西的任何一边,然后反过来做。保存旧状态,然后获取新状态。

于 2013-07-02T10:14:35.537 回答