SFML - sf::RenderWindow,分割文件

SFML - sf::RenderWindow, dividing files

所以这可能是一件微不足道的事情,但我真的需要知道为什么它会以这种方式发生以及我该如何改变它。

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

所以我想记住新的关键字、构造函数、方法,同时让我的代码组织得井井有条 - 使用我所学的知识来保持代码的整洁和易于编辑、调试。

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

这可能是因为析构函数在我打开它后立即被调用,添加更多函数以保持对象忙碌是可行的方法,但是我想了解它。这是我在学习 objective 编程时不太理解的最后一件事。对象的工作方式。在我创建它们之后,我将它们用于某些任务,但是当我完成后它们就会被删除,有时我又需要它们。我只是想了解它是如何工作的,并发现非常简单快捷 fix/idea 让它在我想要的时候一直工作。

代码:

第一个节目:

#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();
        }
    }
}

第二个节目:

main.cpp

#include <SFML/Graphics.hpp>
#include "Game.cpp"

int main()
{
    Game game;
    game.run();
}

Game.cpp

#include "Game.h"

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

    void Game::run()
    {
        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;

};

你的第二个程序应该有一个小的变化。

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

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

提示,通常您不希望对 game-loop 使用 isOpen()。我建议你看看 enum 类.

这是一个很棒的视频,解释了如何使用它们。

link

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

在此处的构造函数中,您正在创建一个新的 RenderWindow 对象,一旦构造函数退出,该对象将立即被销毁。您要做的是初始化 RenderWindow,它是 class 的成员。您可以通过以下两种方式之一执行此操作,即使用成员初始值设定项列表中的 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,然后立即将其销毁,而在第二个示例中,您正在初始化 member-variable 版本,它将保留你的 window 只要包含它的 Game 对象没有被销毁(或者只要你不手动销毁 window)。