在 SFML 上检测到多个按键,无法以任何其他方式解决,并且在不同机器上的工作方式不同

Posted

技术标签:

【中文标题】在 SFML 上检测到多个按键,无法以任何其他方式解决,并且在不同机器上的工作方式不同【英文标题】:Multiple key presses detected on SFML, can't solve it in any other way and works differently on different machines 【发布时间】:2021-12-09 22:55:48 【问题描述】:

这是我在这里的第一篇文章。 我正在尝试解决我在使用多个客户端的 SFML 项目中遇到的问题,这些客户端通过可以在呈现窗口中键入的文本进行通信,然后使用选择器发送到其他套接字。 我的问题是每次我按下键盘的一个按钮时,窗口都会检测到 3 或 4,如果我在另一台机器上尝试它,行为就会改变。 我尝试了几乎所有解决方案,包括 setKeyRepeatEnabled(false);

这是更新函数

void Client::Update(Input* input,sf::Event& Ev, sf::Font& font, sf::RenderWindow& window)


        if (input->isKeyDown(sf::Keyboard::Return))
        
            sf::Packet packet;
            packet << id + ": " + text;
            socket.send(packet);
            sf::Text displayText(text, font, 20);
            displayText.setFillColor(sf::Color::Red);
            chat.push_back(displayText);
            text = "";
            input->setKeyUp(sf::Keyboard::Return);
        
        else if (input->isKeyDown(sf::Keyboard::Backspace))
        
            if (text.size() > 0)
                text.pop_back();
        
        else if (input->isKeyDown(sf::Keyboard::Space))
        
            text += ' ';
        
        else if (Ev.type == sf::Event::TextEntered)
        
                text += Ev.text.unicode;
                return;
        
        //sf::Event::TextEntered
        //text += Ev.text.unicode;


这是渲染图。

void Client::Render(sf::Font& font, sf::RenderWindow& window)

    sf::Packet packet;
    socket.receive(packet);
    std::string temptext;
    if (packet >> temptext)
    
        sf::Text displayText(temptext, font, 20);
        displayText.setFillColor(sf::Color::Blue);
        chat.push_back(displayText);
    
    int i = 0;
    for (i; i < chat.size(); i++)
    
        chat[i].setPosition(0, i * 20);
        window.draw(chat[i]);
    
    sf::Text drawText(text, font, 20);
    drawText.setFillColor(sf::Color::Red);
    drawText.setPosition(0, i * 20);

    window.draw(drawText);

【问题讨论】:

【参考方案1】:

我不认为isKeyDown 函数是 SFML 的一部分,所以我假设您是您实现的东西,或者是 SFML 先前版本(当前 2.5.1)的一部分。

在 SFML 中有三种方法可以检测键盘输入。

    sf::Keyboard::isKeyPressed: 看起来这就是你正在使用的那个。每次按下该键都是如此。你绝对不想要这个。 window.setKeyRepeatEnabled(false) 显然不起作用,因为您不是通过窗口获取输入,而是直接从键盘获取。

    sf::Event::KeyPressed and sf::Event::KeyReleased 事件:为此,window.setKeyRepeatEnabled(false) 会起作用,但它仍然不是处理文本输入的推荐方式,因为它需要你在身边进行大量的杂耍来处理组合键(重音、uppa.

    sf::Event::TextEntered event:现在,这是处理打字的最佳和推荐方式。查看教程以了解如何使用它。

【讨论】:

以上是关于在 SFML 上检测到多个按键,无法以任何其他方式解决,并且在不同机器上的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章

在jQuery中检测单个按键事件上的多个键

检测通知何时出现(来自其他应用程序)以更改我的布局

如何在Node.js中检测键序列以执行某些操作

如何检测以编程方式触摸了哪个子视图

obj -c IOS检测大写锁定按键事件

以编程方式从子视图快速返回按键事件