#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.
sf::Keyboard::isKeyPressed
: похоже, это тот, который вы используете. Это будет верно при каждом цикле нажатия клавиши. Вы определенно этого не хотите. Очевидноwindow.setKeyRepeatEnabled(false)
, что это не сработает, потому что вы получаете ввод не через окно, а непосредственно с клавиатуры.sf::Event::KeyPressed
иsf::Event::KeyReleased
события: для этогоwindow.setKeyRepeatEnabled(false)
будет работать, но все же это не рекомендуемый способ работы с вводом текста, так как для обработки комбинаций клавиш (акценты, uppa.sf::Event::TextEntered
событие: теперь это лучший и рекомендуемый способ обработки ввода. Ознакомьтесь с руководством, чтобы узнать, как его использовать.