SFML-sf::RenderWindow,分割文件
SFML - sf::RenderWindow, dividing files
所以它可能是三重的,但我真的需要知道为什么它会以这种方式发生,以及我如何改变它。
所以我今天开始学习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()。我建议您研究枚举类。
这是一个很好的视频,解释了你将如何使用它们。
链接
- Boost文件系统路径中的分割故障
- 从文件(使用strtok()和strcpy())解开数据时进行分割故障
- 知道分割故障在哪里比较两个文件
- 函数仅在按Enter或到达文件末尾时才会导致分割故障
- 合并排序,I/O使用文件显示分割故障
- 我在分割图像文件时遇到分割错误
- SFML-sf::RenderWindow,分割文件
- 2个YUV文件的PSNR计算器使用c++分割错误
- CMake在build和src目录之间分割生成的文件
- 分割错误读取文件
- 从文件逐行加载2D矢量时出现分割错误
- 如何在多个.cpp和.cu文件之间分割类定义
- 分割故障和wav文件阅读器
- 加载纹理文件时出现分割错误"big"
- 我们如何将一个100gb的文件分割成100个1gb的文件?
- 当我试图读取文件时,如何避免分割冲突
- 使用输入文件流分割错误
- 在多个ui文件之间分割Qt表单
- 将文件分割成相等的字节段,用完整字分隔(C/ c++)
- c ++给出了所有0的文本文件中的分割错误