2016-01-06 36 views
0

所以它可能是一个trival,但我真的需要知道它为什么发生的方式,以及如何改变它。SFML - sf :: RenderWindow,划分文件

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

所以,我想记住新的关键字,构造函数,方法,但也使我的代码组织得很好 - 使用我学会了保持清洁和易于编辑,调试。

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

这可能是因为析构函数在打开后调用并添加更多函数来保持对象繁忙是好的方法,但我想理解它。当我学习客观编程时,我不是很了解最后一件事。对象的工作方式。在创建它们之后,我正在使用它们执行某些任务,但是当完成时它们将被删除,有时候我再次需要它们。我只是想了解它是如何工作的,并找到真正简单快速的解决方案/想法,使其工作,只要我想要它。

代码:

第一个程序:

#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; 

}; 

回答

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

在你的构造在这里,您要创建一个新的RenderWindow对象,它立即销毁一旦构造退出。你想要做的是初始化你的班级的成员RenderWindow。你可以在以下两种方式之一,无论是使用RenderWindow构造函数成员初始化列表:

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

或者调用构造函数体中创建功能。

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

谢谢你的回答:) – Advent

1

你的第二个程序应该与一个小的变化来工作。

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

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

只是一个提示,通常你不想使用isOpen()作为游戏循环。我建议你看看枚举类。

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

link

+0

谢谢,我会检查它。为什么我不应该使用isOpen()?我的意思是,我在实际创建SFML库的人的代码中看到了这一点,所以真的有什么理由不好使用它?我没有从中学到很多关于枚举的知识,我做了一些关于它的教训,有时候用它来进行大学项目,但是我没有发现我现在正在写的小程序的必要性,这种方式我完全忘记了使用枚举所有。你能帮我推理一下,并给出一些例子,它实际上节省了你一些时间/使代码更容易阅读/编辑? – Advent

+0

那么,例如。你知道在很多游戏中你可以通过按alt + f4来关闭窗口吗?使用Enum类可以定义游戏状态,例如MainMenu,GameStart,GameClose,Options以及游戏中可能存在的许多其他事物,并根据用户的具体情况改变枚举对象的状态。这是一个非常简单而有用的概念。而且它是干净的代码,所以如果用户按下alt + f4,则可以将枚举对象更改为等于gameClose。保持干净整洁。 –

+0

好,所以改变这条线使它工作。你能告诉我为什么这样工作吗? – Advent

2

您需要更改此:

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

要这样:

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

} 

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

+1

哦,正是它是如何写在我读的书中,我只是没有完全理解它。你的解释对我来说很明显。十分感谢 ! – Advent