【问题标题】:Handling input with GLFW使用 GLFW 处理输入
【发布时间】:2014-01-11 01:14:55
【问题描述】:

这是我用来检查 2D 基本游戏的用户输入的键盘回调方法的定义。但是,我在处理某些同时按键时遇到问题。

例如,如果我按住向右和向上箭头键,播放器会向屏幕右上角移动 45 度。然后,在仍然按住向上和向右键的同时,如果我按空格键(发射弹丸),效果也一样。

但是,如果我按住向左和向下箭头键,播放器会按应有的移动,但是当我按空格键时,我没有收到任何输入响应,因此向下和向左移动时我无法发射弹丸。所有其他运动+火炮组合都起作用,只是向下和向左不起作用……我不知道为什么。有什么想法吗?

if (key == GLFW_KEY_LEFT)
{
    GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_LEFT, action);
}
else if (key == GLFW_KEY_RIGHT)
{
    GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_RIGHT, action);
}
else if (key == GLFW_KEY_UP)
{
    GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_UP, action);
}
else if (key == GLFW_KEY_DOWN)
{
    GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_DOWN, action);
}
else if (key == GLFW_KEY_SPACE)
{
    GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_SPACE, action);
}
else { }

【问题讨论】:

    标签: c++ opengl input glfw


    【解决方案1】:

    Rollover 是允许键盘一次正确注册许多按键的属性。键盘按行和列连接。即使键盘不是方形的,各个键也大致位于连接其开关的导线的方形矩阵中。控制器连接一行,然后测试查看哪些列被命中。一些组合键会“遮蔽”其他组合键。控制器可以判断输入何时不明确并且不发送任何键。

    更好的键盘使用二极管来避免歧义,因此支持“完全翻转”,尽管实际上 USB 限制您一次使用所有修饰符加上 6 个不同的键码。

    【讨论】:

      【解决方案2】:

      听起来像crappy keyboard

      您可能需要购买a better one

      或者使用不同的组合键。

      【讨论】:

        【解决方案3】:

        代码应该是

        if (key == GLFW_KEY_LEFT)
        {
            GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_LEFT, action);
        }
        
        if (key == GLFW_KEY_RIGHT)
        {
            GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_RIGHT, action);
        }
        
        if (key == GLFW_KEY_UP)
        {
            GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_UP, action);
        }
        
        if (key == GLFW_KEY_DOWN)
        {
            GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_DOWN, action);
        }
        
        if (key == GLFW_KEY_SPACE)
        {
            GameController::getInstance()->getPlayer()->changeKeyPress(GLFW_KEY_SPACE, action);
        }
        

        问题是您的代码一次只检测 1 个按键,因此当您同时按下左右键时,只会触发 if (key == GLFW_KEY_LEFT)

        【讨论】:

          猜你喜欢
          • 2018-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          • 1970-01-01
          • 2021-06-27
          相关资源
          最近更新 更多