C++ sfml 在 window 打开后立即收到关闭事件
C++ sfml receives close event just after window opens
我正在尝试遵循此 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 事件。我做了一些研究,这并不是因为 window 对我的屏幕来说太大了。
为了解决我的问题,我不得不将一个 int 变量 canClose
添加到 0,然后将事件循环修改为此。
if(Event.type == sf::Event::Closed)
{
if(canClose == 1)
{
Window.close();
} else {
canClose = 1;
}
}
执行此操作后,window 现在会按预期打开并运行。
P.S 这是使用 xcode 和 SFML 模板制作的。
编辑:
刚刚创建了一个新的 xcode SFML 项目并删除了其中的一些代码以创建一个空的 window,它似乎很糟糕。代码看起来完全一样。这接缝很奇怪,因为它是完全相同的代码。
您的问题是您声明了变量 Event 事件类型,您必须将变量名称更改为小写。
这样
#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;
这样你就不会有任何问题
据我所知,不要使用 if 语句来检查事件,使用 switch 语句。尝试轮询事件时也使用 while(window.isOpen())
您是否已阅读 http://www.sfml-dev.org 上的教程?因为我可以保证它是学习 sfml 的最佳来源。在使用其他来源之前使用它。
我正在尝试遵循此 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 事件。我做了一些研究,这并不是因为 window 对我的屏幕来说太大了。
为了解决我的问题,我不得不将一个 int 变量 canClose
添加到 0,然后将事件循环修改为此。
if(Event.type == sf::Event::Closed)
{
if(canClose == 1)
{
Window.close();
} else {
canClose = 1;
}
}
执行此操作后,window 现在会按预期打开并运行。
P.S 这是使用 xcode 和 SFML 模板制作的。
编辑:
刚刚创建了一个新的 xcode SFML 项目并删除了其中的一些代码以创建一个空的 window,它似乎很糟糕。代码看起来完全一样。这接缝很奇怪,因为它是完全相同的代码。
您的问题是您声明了变量 Event 事件类型,您必须将变量名称更改为小写。
这样
#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;
这样你就不会有任何问题
据我所知,不要使用 if 语句来检查事件,使用 switch 语句。尝试轮询事件时也使用 while(window.isOpen())
您是否已阅读 http://www.sfml-dev.org 上的教程?因为我可以保证它是学习 sfml 的最佳来源。在使用其他来源之前使用它。