SFML - sf :: RenderWindow,分割文件

时间:2016-01-06 01:36:08

标签: c++ sfml

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

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

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

我的第一个代码是显示Window,我以两种方式创建相同的代码,通常将所有内容放到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;

};

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

你需要改变这个:

app.controller('MainCtrl', function($scope) {
  $scope.psykers = [
    {name: 'Kairos Fateweaver'       , warpCharge: 1, mastery: 11},
        {name: 'Pink Horrors(10)'        , warpCharge: 2, mastery: 12},
        {name: 'Pink Horrors(11-14)'     , warpCharge: 3, mastery: 13},
        {name: 'Pink Horrors(15 or more)', warpCharge: 4, mastery: 14},
        {name: 'Sorcerer (lvl 1)'        , warpCharge: 5, mastery: 15},
        {name: 'Sorcerer (lvl 2)'        , warpCharge: 6, mastery: 16},
        {name: 'Sorcerer (lvl 3)'        , warpCharge: 7, mastery: 17}
    ];

    $scope.psykerClicked = function(psyker) {
      $scope.chosenPsyker = psyker;
    }
});

对此:

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

在第一个示例中,您在构造函数中创建Game::Game() : mainWindow(sf::VideoMode(800,600),"Main Window"); { } ,然后立即销毁它,而在第二个示例中,您正在初始化成员变量版本,这将保留您的窗口只要包含它的sf::RenderWindow对象不被销毁(或者只要您不手动销毁窗口)。

答案 2 :(得分:1)

你的第二个程序应该使用一个小的变更。

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

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

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

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

link