Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SFML-sf::RenderWindow,分割文件_C++_Sfml - Fatal编程技术网

C++ SFML-sf::RenderWindow,分割文件

C++ SFML-sf::RenderWindow,分割文件,c++,sfml,C++,Sfml,因此,这可能是一些琐碎的事情,但我真的需要知道为什么它会这样发生,以及我如何才能改变它 所以我今天开始学习SFML,我正在阅读SFML游戏开发电子书,看到了非常有趣且编写良好的代码。我阅读了有关SFML的教程,并开始学习这门语言,因为我理解了它应该如何工作的一般概念 所以我想记住新的关键字、构造器、方法,但也要让我的代码组织得井井有条——用我学到的东西保持代码整洁,易于编辑、调试 我的第一个代码是显示窗口,我以两种方式创建了相同的代码,通常将所有内容放在主函数中并分开。事情是,第一个窗口显示,只

因此,这可能是一些琐碎的事情,但我真的需要知道为什么它会这样发生,以及我如何才能改变它

所以我今天开始学习SFML,我正在阅读SFML游戏开发电子书,看到了非常有趣且编写良好的代码。我阅读了有关SFML的教程,并开始学习这门语言,因为我理解了它应该如何工作的一般概念

所以我想记住新的关键字、构造器、方法,但也要让我的代码组织得井井有条——用我学到的东西保持代码整洁,易于编辑、调试

我的第一个代码是显示窗口,我以两种方式创建了相同的代码,通常将所有内容放在主函数中并分开。事情是,第一个窗口显示,只要我不关闭它,第二个窗口显示不到一秒,程序关闭

这可能是因为析构函数在我打开它之后就被调用了,添加更多的函数使对象保持忙碌是一个好办法,但我想了解它。这是我在学习目标编程时最后一件不太理解的事情。对象的工作方式。在我创建它们之后,我将它们用于特定的任务,但当我完成后,它们将被删除,有时我再次需要它们。我只是想了解它是如何工作的,并找到真正简单快捷的解决方法/想法,让它在我想要的时间内工作

代码:

第一个节目:

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow mainWindow(sf::VideoMode(800,600),"Main Window");

    while(mainWindow.isOpen())
    {
        sf::Event openEvent;
        while(mainWindow.pollEvent(openEvent))
        {
            switch(openEvent.type)
            {
                case sf::Event::Closed:
                mainWindow.close();
                break;
            }
            mainWindow.clear();
            mainWindow.display();
        }
    }
}
Game.h

class Game
{
    public:
    Game();
    void run();

    private:
    sf::RenderWindow mainWindow;

};

你的第二个程序应该只需要一个小改动就可以运行

您已经有一个RenderWindow类型的名为mainWindow的变量。您将不得不在主窗口中使用create()函数,而不是按现在的方式创建它

Game::Game()
{
     mainWindow.create(sf::VideoMode(800,600),"Main Window");
}   
只是一个提示,通常您不希望在游戏循环中使用isOpen()。我建议您研究一下枚举类

这是一个很好的视频,解释你将如何使用它们


您的第二个程序应该只需要一个小改动即可运行

您已经有一个RenderWindow类型的名为mainWindow的变量。您将不得不在主窗口中使用create()函数,而不是按现在的方式创建它

Game::Game()
{
     mainWindow.create(sf::VideoMode(800,600),"Main Window");
}   
只是一个提示,通常您不希望在游戏循环中使用isOpen()。我建议您研究一下枚举类

这是一个很好的视频,解释你将如何使用它们

在这里的构造函数中,您正在创建一个新的
RenderWindow
对象,一旦构造函数退出,该对象将立即被销毁。您要做的是初始化类成员的
RenderWindow
。您可以通过以下两种方式之一执行此操作:使用成员初始值设定项列表中的
RenderWindow
构造函数:

Game::Game()
    :mainWindow(sf::VideoMode(800,600),"Main Window")
{}
或者调用构造函数体中的
create
函数,如下所示:

Game::Game()
{
    mainWindow.create(sf::VideoMode(800,600),"Main Window");
}
在这里的构造函数中,您正在创建一个新的
RenderWindow
对象,一旦构造函数退出,该对象将立即被销毁。您要做的是初始化类成员的
RenderWindow
。您可以通过以下两种方式之一执行此操作:使用成员初始值设定项列表中的
RenderWindow
构造函数:

Game::Game()
    :mainWindow(sf::VideoMode(800,600),"Main Window")
{}
或者调用构造函数体中的
create
函数,如下所示:

Game::Game()
{
    mainWindow.create(sf::VideoMode(800,600),"Main Window");
}

您需要更改以下内容:

Game::Game()
{
    sf::RenderWindow mainWindow(sf::VideoMode(800,600),"Main Window");
}
为此:

Game::Game() : mainWindow(sf::VideoMode(800,600),"Main Window");
{

}

在第一个示例中,您正在构造函数中创建一个
sf::RenderWindow
,然后立即销毁它,而在第二个示例中,您正在初始化成员变量版本,只要包含它的
Game
对象没有销毁,它就会保持窗口(或者只要不手动破坏窗口即可)。

您需要更改此选项:

Game::Game()
{
    sf::RenderWindow mainWindow(sf::VideoMode(800,600),"Main Window");
}
为此:

Game::Game() : mainWindow(sf::VideoMode(800,600),"Main Window");
{

}

在第一个示例中,您正在构造函数中创建一个
sf::RenderWindow
,然后立即销毁它,而在第二个示例中,您正在初始化成员变量版本,只要包含它的
Game
对象没有销毁,它就会保持窗口(或者只要您不手动破坏窗口)。

谢谢,我会检查它。为什么我不应该使用isOpen()?我的意思是,我在实际创建SFML库的人的代码中看到了这一点,所以真的有什么理由认为使用它不好吗?我没有学到很多关于Enum的知识,我做了一个关于Enum的课程,有时在大学项目中使用它,但我发现我现在正在编写的小程序不需要它,这样我就完全放弃了t关于使用枚举。你能帮我推理一下,并给出一些例子,说明它实际上在哪些方面为你节省了一些时间/使代码更易于阅读/编辑吗?例如,你知道有多少游戏可以通过按alt+f4关闭窗口吗?使用枚举类,你可以定义游戏的状态,如-MainMenu、GameStart、GameClose和选项a在游戏中你可能会有很多其他的东西,根据用户做什么,你只需要改变你的枚举对象的状态。这是一个非常简单和有用的概念。它是干净的代码,所以如果用户按下alt+f4,你只需将枚举对象改成与gameClose相等。保持它的整洁。好的,所以更改这一行就可以了。Cou你能告诉我为什么它是这样工作的吗?因为你正在从以前存在的窗口(你在.h文件中创建的窗口)重新创建另一个窗口。这不是您想要的。您想初始化您在.h文件中首先创建的一个,以便在其他函数中使用它。alt+f4会向窗口发送关闭事件。因此,通过选中
isOpen()
,它会很好地关闭。谢谢,我会选中它。为什么我不应该使用isOpen()?我的意思是,我在实际创建SFML库的人的代码中看到了这一点,那么使用它真的有什么不好的原因吗?我没有学到很多关于Enum的知识,我上过一堂关于Enum的课,有时在大学项目中使用它,但我觉得它对sma没有必要