【问题标题】:C++ sfml receives close event just after window opensC++ sfml 在窗口打开后收到关闭事件
【发布时间】:2015-04-12 05:26:45
【问题描述】:

我正在尝试遵循 link 中的 SFML 教程,但是,由于某种原因,我的应用程序似乎在我的程序进入事件循环后立即调用关闭事件。

这是我的代码。

#include <SFML/Graphics.hpp>
#include <iostream>

// Here is a small helper for you ! Have a look.
#include "ResourcePath.hpp"

int main()
{
sf::RenderWindow Window(sf::VideoMode(500,400),"SFML tutorial");
/* Or we can do this
 * sf::RenderWindow Window
 * Window.create (sf::VideoMode(800,600),"SFML tutorial");
 */

//Game loop
while(Window.isOpen())
{
    sf::Event Event;
    while(Window.pollEvent(Event));
    {
        if(Event.type == sf::Event::Closed)
        {
            Window.close();
            std::cout << "Close" << std::endl;

        }
    }
}

return 0;

}

由于某种原因,一旦我的程序进入事件循环,它就会收到一个 sf::Event::Closed 事件。我做了一些研究,这不是因为窗口对我的屏幕来说太大了。
为了解决我的问题,我不得不将一个 int 变量 canClose 设置为 0,然后将事件循环修改为此。

if(Event.type == sf::Event::Closed)
{
    if(canClose == 1)
    {
        Window.close();
    } else {
        canClose = 1;
    }
}

完成此操作后,窗口现在会按预期打开并运行。

P.S 这是使用 xcode 和 SFML 模板制作的。

编辑:
刚刚创建了一个新的 xcode SFML 项目并删除了其中的一些代码以创建一个空窗口,这似乎很糟糕。代码看起来完全一样。这看起来很奇怪,因为它是完全相同的代码。

【问题讨论】:

    标签: c++ xcode sfml


    【解决方案1】:

    据我所知,不要使用 if 语句来检查事件,而是使用 switch 语句。尝试轮询事件时也使用while(window.isOpen())

    您阅读过http://www.sfml-dev.org 上的教程吗?因为我可以保证它是学习 sfml 的最佳来源。在使用其他来源之前使用它。

    【讨论】:

    • 我正在使用的教程现在说要使用 switch 语句。他们可能使用了 if 语句,所以我们很容易习惯。我也更喜欢通过视频学习,因为如果我正在阅读文档,我往往会分心并登机。不过感谢您的提示!
    • @aPyDeveloper 我和你在同一条船上。从视频中学习是我喜欢的。但是,如果您想获得成功,则需要阅读源代码和文档。我这样做的方式是进入全屏模式,每次你感到心烦意乱时,试着重新调整自己的注意力。也给自己一些动力。
    • 感谢您的提示。下次试试。
    【解决方案2】:

    你的问题是你声明了变量EventEvent类型,你得把变量名改成小写。

    这样

    #include <SFML/Graphics.hpp>
    #include <iostream>
    
    // Here is a small helper for you ! Have a look.
    #include "ResourcePath.hpp"
    
    int main()
    {
    sf::RenderWindow Window(sf::VideoMode(500,400),"SFML tutorial");
    /* Or we can do this
    * sf::RenderWindow Window
    * Window.create (sf::VideoMode(800,600),"SFML tutorial");
    */
    
    //Game loop
    while(Window.isOpen())
    {
    sf::Event event;
    while(Window.pollEvent(event));
    {
        if(event.type == sf::Event::Closed)
        {
            Window.close();
            std::cout << "Close" << std::endl;
    
        }
    }
    } 
    
    return 0;
    

    这样你就不会遇到任何问题

    【讨论】:

    • 试过了,还是不行。你知道还有什么可能导致这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多