【问题标题】:Sfml Text Entered arrow keysSfml 文本输入的箭头键
【发布时间】:2016-10-04 18:34:43
【问题描述】:

我正在用 sfml 制作控制台风格的游戏。它是图形界面,但游戏本身包含控制台。我正在使用 Text Entered 事件在控制台中编写内容,但我也想用箭头键移动光标(控制台光标而不是鼠标)。为了更具体地说明文本输入事件,我使用 event.text.unicode 作为键值。但是箭头键 unicode 值在我的电脑中不起作用。我用 37 表示左箭头,39 表示右箭头,但它不起作用。这是我的控制台的关键处理功能。

void Console::update(int unicode) {
    if(unicode == 8) { // Backspace
        deleteLast();
    } else if(unicode == 13) { // Enter
        newLine();
    } else if(unicode == 37) { // Left arrow key
        currentX--;
        std::cout << "Left arrow" << std::endl;
    } else if(unicode == 39) { // Right arrow key
        currentX++;
        std::cout << "Right arrow" << std::endl;
    } else { // Normal characters
        buffer[(currentY == 0) ? currentX : (currentY * maxColumn) + currentX] = (char)unicode;
        currentX++;
        if(currentX == maxColumn - 1) {
            newLine();
        }
        std::cout << "[KEY TYPED] X: " << currentX << " Y: " << currentY << std::endl;
    }
}

提前致谢:)

编辑:我想我解决了。我使用 KeyPressed 事件来处理特殊键。和 TextEntered 用于处理普通字符。

【问题讨论】:

  • 37和39的意义是什么?这些数字与左右方向键有什么关系?
  • 恕我直言,switch 语句将更具可读性。
  • 您是否使用调试器验证了密钥代码是否正确?我的理解是左箭头和右箭头需要多个字符来表示,如果按下就会超出ASCII范围。
  • 您可以使用'&lt;''&gt;' 让您的代码比数字更具可读性。

标签: c++ sfml


【解决方案1】:

对于那些有同样问题的人:
从事件类型变量中,首先检查它是否是键盘事件

if(event.type == sf::Event::KeyPressed)

然后检查是否是箭头:

if(event.key.code == sf::Keyboard::Up)
    //do stuff
if(event.key.code == sf::Keyboard::Down)
    //do stuff

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多