sfml 中是否有等同于 getch 的东西?
Is there an equivalent of getch in sfml?
目前,我正在尝试仅使用 sfml 库创建一个行为类似于 getch()
的函数(暂停,直到找到一个键)。重要的是要注意,这应该在事件循环之外调用。我试过四处寻找类似的东西,但我什么也没找到。我当前的代码如下所示:
int waitForKeyboardHit (sf::Window *win) {
sf::Event event;
while (true) {
while (win->pollEvent (event)) {
if (event.type == sf::Event::KeyPressed) {
return event.key.code;
}
}
}
return -1;
}
虽然这在大多数情况下工作正常,但是如果任何 KeyPressed 事件在调用此函数之前进入事件 window 队列而不是函数立即结束而不是等到下一次键盘按下。在调用此函数之前,我已经尝试寻找清除 window 事件队列的方法,但我也没有找到任何可以做到这一点的方法。
while (win->pollEvent(event)) ;
(注意分号)将清除事件队列,但这可能不是您想要的方式:停止整个程序及其输入逻辑很少是一件好事。我相信使用某种 FSA 会更好。就像维基百科的这个例子,机器等待硬币(就像你等待按键):
此外,您应该重绘场景并在 while(true)
循环中调用 display()
至少不时地刷新屏幕。
目前,我正在尝试仅使用 sfml 库创建一个行为类似于 getch()
的函数(暂停,直到找到一个键)。重要的是要注意,这应该在事件循环之外调用。我试过四处寻找类似的东西,但我什么也没找到。我当前的代码如下所示:
int waitForKeyboardHit (sf::Window *win) {
sf::Event event;
while (true) {
while (win->pollEvent (event)) {
if (event.type == sf::Event::KeyPressed) {
return event.key.code;
}
}
}
return -1;
}
虽然这在大多数情况下工作正常,但是如果任何 KeyPressed 事件在调用此函数之前进入事件 window 队列而不是函数立即结束而不是等到下一次键盘按下。在调用此函数之前,我已经尝试寻找清除 window 事件队列的方法,但我也没有找到任何可以做到这一点的方法。
while (win->pollEvent(event)) ;
(注意分号)将清除事件队列,但这可能不是您想要的方式:停止整个程序及其输入逻辑很少是一件好事。我相信使用某种 FSA 会更好。就像维基百科的这个例子,机器等待硬币(就像你等待按键):
此外,您应该重绘场景并在 while(true)
循环中调用 display()
至少不时地刷新屏幕。