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 类.
这是一个很棒的视频,解释了如何使用它们。
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)。
所以这可能是一件微不足道的事情,但我真的需要知道为什么它会以这种方式发生以及我该如何改变它。
所以我今天开始学习 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 类.
这是一个很棒的视频,解释了如何使用它们。
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)。