Множественные нажатия клавиш, обнаруженные в SFML, не могут решить ее никаким другим способом и работают по-разному на разных машинах

#c #networking #sfml

Вопрос:

это мой первый пост здесь. Я пытаюсь решить проблему, с которой я сталкиваюсь в своем проекте SFML, где я использую несколько клиентов, которые обмениваются текстами, которые можно ввести в отображаемом окне, а затем отправить в другие сокеты с помощью селектора. Моя проблема в том, что каждый раз, когда я нажимаю одну кнопку клавиатуры, окно обнаруживает, что это 3 или 4, и если я попробую это сделать на другой машине, поведение изменится. Я перепробовал почти все решения, включая setKeyRepeatEnabled(false);

Это функция обновления

 void Client::Update(Input* input,sf::Eventamp; Ev, sf::Fontamp; font, sf::RenderWindowamp; 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::Fontamp; font, sf::RenderWindowamp; 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.

  1. sf::Keyboard::isKeyPressed : похоже, это тот, который вы используете. Это будет верно при каждом цикле нажатия клавиши. Вы определенно этого не хотите. Очевидно window.setKeyRepeatEnabled(false) , что это не сработает, потому что вы получаете ввод не через окно, а непосредственно с клавиатуры.
  2. sf::Event::KeyPressed и sf::Event::KeyReleased события: для этого window.setKeyRepeatEnabled(false) будет работать, но все же это не рекомендуемый способ работы с вводом текста, так как для обработки комбинаций клавиш (акценты, uppa.
  3. sf::Event::TextEntered событие: теперь это лучший и рекомендуемый способ обработки ввода. Ознакомьтесь с руководством, чтобы узнать, как его использовать.