SFML-sf::RenderWindow,分割文件

SFML - sf::RenderWindow, dividing files

本文关键字:文件 分割 RenderWindow SFML-sf      更新时间:2023-10-16

所以它可能是三重的,但我真的需要知道为什么它会以这种方式发生,以及我如何改变它。

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

所以我想记住新的关键字、构造函数和方法,但也要让我的代码组织得很好——用我学到的东西来保持它的整洁和易于编辑、调试。

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

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

代码:

第一个程序:

#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;
};
Game::Game()
{
    sf::RenderWindow mainWindow(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对象没有被销毁(或者只要您没有手动销毁窗口),它就会保留您的窗口。

您的第二个程序应该使用一个小的Change。

您已经有一个名为mainWindow的RenderWindow类型的变量。您将不得不在mainWindow中使用create()函数,而不是像现在这样创建它。

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

只是一个提示,通常你不想在游戏循环中使用isOpen()。我建议您研究枚举类。

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

链接