Так что, вероятно, это что-то тривиальное, но мне действительно нужно знать, почему это происходит именно так, и как я могу это изменить.

Итак, я начал изучать SFML сегодня, читал книгу по разработке игр SFML и увидел очень интересный и хорошо написанный код. Я прошел через руководства по SFML и начал изучать язык, поскольку понял общее представление о том, как он должен работать.

Поэтому я хотел запомнить новые ключевые слова, конструкторы, методы, а также сделать свой код хорошо организованным - используя то, что я узнал, чтобы он оставался чистым и легким для редактирования и отладки.

Моим первым кодом было отображение окна, и я создал один и тот же код обоими способами, обычно помещая все в основную функцию и разделяя их. Дело в том, что первое окно отображается до тех пор, пока я не закрою его, а второе отображается менее секунды, и программа выключается.

Вероятно, потому, что деструктор вызывается сразу после того, как я его включаю, и добавление дополнительных функций, чтобы объект был занят, - это способ пойти, но я хочу понять это. Это последнее, чего я не понимаю, когда изучал объективное программирование. Как работают объекты. Сразу после их создания я использую их для определенной задачи, но затем, когда я закончу, они удаляются, ну, иногда они мне нужны снова. Я просто хочу понять, как это работает, и найти действительно простое и быстрое решение / идею, чтобы заставить ее работать столько, сколько я хочу.

Код:

Первая программа:

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

};
0
Advent 6 Янв 2016 в 04:36

3 ответа

Лучший ответ
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");
}
2
Fabio Crispino 27 Авг 2020 в 19:14

Вам нужно изменить это:

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

К этому:

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

}

В первом примере вы создаете sf::RenderWindow внутри конструктора, а затем немедленно его уничтожаете, тогда как во втором примере вы инициализируете версию переменной-члена, которая будет сохранять ваше окно до тех пор, пока { Объект {X1}}, который его содержит, не уничтожается (или до тех пор, пока вы не уничтожите окно вручную).

2
Bryn McKerracher 6 Янв 2016 в 01:48

Ваша вторая программа должна работать с одним небольшим Изменением.

У вас уже есть переменная с именем mainWindow типа RenderWindow. Вместо того, чтобы создавать его так, как вы делаете, вам придется использовать функцию create () в mainWindow.

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

Просто совет: обычно вы не хотите использовать isOpen () для игрового цикла. Я рекомендую вам изучить классы enum.

Вот отличное видео, объясняющее, как их использовать.

ссылка на сайт

1
Tarik Neaj 6 Янв 2016 в 01:45