SFML - 键盘事件

时间:2016-02-06 13:27:37

标签: c++ sfml

尝试弄清楚如何使用按钮关闭窗口,在这种情况下是“Esc&#39”按钮。在我的第一种方法中,我试着这样做:

if (sf::event.type == sf::Keyboard::Escape)
    window.close();

结果并不好,看起来我的程序注意到我按下Escape按钮。所以我尝试了这个approuch:

if (sf::event.type == sf::Keyboard::isKeyPressed(sf::Keyboard::Esc))
    window.close();

那也不起作用,就在我要问这里之前,我发现这条线实际上有效(你实际上处理事件后感觉不对吗?)

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Esc))
    window.close();

我的问题是;什么是正确的方法呢?如果像我先做的那样写作,为什么不这样做呢?似乎'根据YouTube视频,第一种和第二种方法有效。但是在SFML 2.0和前进中,只有最后一个。是这样的吗?

3 个答案:

答案 0 :(得分:4)

前两个不起作用,因为你只是在猜测。检查包括检查事件类型,然后检查密钥代码:

if (event.type == sf::Event::KeyPressed)
    if (event.key.code == sf::Keyboard::Escape)
        window.close();

Reference

你写的第二个随机码:

sf::event.type == sf::Keyboard::isKeyPressed(sf::Keyboard::Esc)

sf::Keyboard::isKeyPressed返回bool,而sf::event.type此时不是1,即sf::Event::Resized(除非您按住密钥并调整窗口大小)。

到最后一个代码示例:

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Esc))
    window.close();

这也是一种可行的方式。如果将其置于sf::Window::pollEvent成功的条件下,它将关闭您的窗口。但它通常在外面,sf::Keyboard可以更容易地在游戏中实现角色移动。

答案 1 :(得分:2)

正如之前提到的LogicStuff, 这样做 - :

if(window.event.type == sf::Event::KeyPressed)
    if(event.key.code == sf::Keyboard::Escape)
        window.close();

SFML遵循此方法,以便将类似类型的事件组合在一起。它起初可能看起来不直观,但它的存在使代码的可读性增加。并始终查看官方文档。他们真的很棒。(与我必须使用的一些工具相比,还不错。:))

答案 2 :(得分:1)

这对我有用:

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::Key::Escape)
            window.close();
        // ... etc ...
    }
}