在c ++的SFML 2.1中,是否有一个sf :: Keyboard函数检查字母表中是否有任何字母被按下?
我知道如何检查某个键是否被按下,如下所示:
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key))
我必须输入所有这些:
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)&&sf::Keyboard::isKeyPressed(sf::Keyboard::B)&&sf::Keyboard::isKeyPressed(sf::Keyboard::C))
......一直到sf::Keyboard::Z
,
或者有更简单的方法吗?
答案 0 :(得分:5)
来自SFML网站:
许多程序员使用KeyPressed事件来获取用户输入,并开始实现疯狂算法,尝试解释所有可能的键组合以生成正确的字符。别这么做!
sf::Keyboard::isKeyPressed
用于检查按键是否被按下,这对于移动之类的事情是有益的:只要玩家持有“左”键。关键,我们希望继续保持他们的性格。 KeyPressed
事件用于检查在按下时按下哪个键,这对于仅发生一次的事情是有益的:如果玩家跳过空格键,我们通常不希望他们保留只要空格键被按下就会跳跃。
但是,在检查输入的文本时,这些解决方案都不是很好。在官方教程中,我们建议不要使用这些来检查文本输入 - 我们实际上已经针对这种情况给出了不同的事件。要做的恰当是通过TextEntered
事件as described here获取密钥的基于文本的内容。从事件中获取文本然后应用您需要的逻辑以确保其有效性,或者(如果可能)直接使用事件中的文本。
答案 1 :(得分:1)
这是每次按下字母键时计数器增加的解决方案。必须将window.setKeyRepeatEnabled()设置为false,以避免在按键时出现多个事件:
#include <SFML/Graphics.hpp>
#include <iostream>
int main() {
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML");
int keyCounter = 0;
window.setKeyRepeatEnabled(false);
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
else if(event.type == sf::Event::KeyPressed) {
if(event.key.code >= sf::Keyboard::A && event.key.code <= sf::Keyboard::Z) {
keyCounter++;
}
} else if(event.type == sf::Event::KeyReleased) {
if(event.key.code >= sf::Keyboard::A && event.key.code <= sf::Keyboard::Z) {
keyCounter--;
}
} else if(event.type == sf::Event::MouseMoved) {
/* move cursor inside the window to observe how the counter
behaves while pressing the keys */
std::cout << keyCounter << std::endl;
}
}
window.clear();
window.display();
}
return 0;
}
替代方法 - 迭代enum
:
#include <SFML/Graphics.hpp>
#include <iostream>
int main() {
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML");
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
} else if(event.type == sf::Event::MouseButtonPressed) {
/* click inside window to see if there is key pressed */
bool isp = false;
for (int i = sf::Keyboard::A; i <= sf::Keyboard::Z; ++i ) {
if(sf::Keyboard::isKeyPressed(static_cast<sf::Keyboard::Key>(i))) {
isp = true;
break;
}
}
std::cout << isp << std::endl;
}
}
window.clear();
window.display();
}
return 0;
}