在 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 上检测到多个按键,无法以任何其他方式解决,并且在不同机器上的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章