这是我在这里的第一篇文章。我正试图解决我正在使用多个客户端的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);
}
我不认为isKeyDown
函数是SFML的一部分,所以我假设你要么是你实现的东西,要么是SFML以前版本的一部分(当前的2.5.1)。
在SFML中有三种检测键盘输入的方法。
-
sf::Keyboard::isKeyPressed
:看起来这是你正在使用的。按下这个键的每个周期都是正确的。你肯定不想这样。window.setKeyRepeatEnabled(false)
显然不会工作,因为你没有通过窗口输入,而是直接从键盘输入。 -
sf::Event::KeyPressed
和sf::Event::KeyReleased
事件:为此,window.setKeyRepeatEnabled(false)
将工作,但它仍然不是处理文本输入的推荐方法,因为它需要大量的杂事在你身边处理键组合(口音,up . -
sf::Event::TextEntered
事件:现在,这是最好的和推荐的方式来处理打字。查看教程,了解如何使用它。