SFML рисования проблема в классе - PullRequest
0 голосов
/ 06 сентября 2018

В этом проекте у меня есть класс Game с основным игровым циклом в качестве одной из его функций, несколько переменных для настройки шрифтов и прочего в качестве переменных-членов и класс Window; базовый класс, охватывающий sf::RenderWindow.

Моя проблема в том, что внутри функции run класса Game я могу очистить окно любым цветом и отобразить, но ничего не могу нарисовать, будь то экземпляр sf::Text, sf::CircleShape и т.д., однако, скопируйте и вставьте код в отдельный файл и скомпилируйте, что работает. Window::getSFMLWindow() просто возвращает ссылку на базовый sf::RenderWindow, ничего особенного. Я также попытался удалить свой класс Window и просто использовать sf::RenderWindow, и это ничего не дало, поэтому проблема не связана с пользовательским классом окна.

Это мой код, удаленный несвязанный код:

Game.cpp

namespace GM {
    Game::Game() {

    }

    int Game::run() {
        sf::Font testFont;
        if(!testFont.loadFromFile(this->fontPath)) {
            std::cerr << "error in loading font" << std::endl; // does not throw error
            return 1;
        }

        sf::Text testText;
            testText.setFont(testFont);
            testText.setString("this is a test string");
            testText.setCharacterSize(30);
            testText.setFillColor(sf::Color::White);


        sf::Event wndEvent;
        while(window.getSFMLWindow().isOpen()) {
            while(window.getSFMLWindow().pollEvent(wndEvent)) {
                switch(wndEvent.type) {
                  case sf::Event::Closed:
                    window.close();
                    return 0;
                }
            }

            window.getSFMLWindow().clear(sf::Color::Black); // does draw

            window.getSFMLWindow().draw(testText); // does not draw

            window.getSFMLWindow().display();
        }

        return 1;
    }
}

main.cpp

int main() {
    GM::Game mainGame;
        mainGame.window.setSize(1200, 675);
        mainGame.window.setTitle("game");
        mainGame.window.setFramerateLimit(60);

        mainGame.fontPath = "./media/font/SourceHanSansJP-Light.otf";


    mainGame.run();
}

Edit:

Window.hpp:

namespace GM {
    class Window {
      public:
        Window(std::string title = "title", int width = 1, int height = 1);

        sf::RenderWindow SFML_Window;
    };
}

window.cpp:

namespace GM {
    Window::Window(std::string title, int width, int height) {
        this->getSFMLWindow().create(sf::VideoMode(width, height), title, sf::Style::Titlebar | sf::Style::Close);
    }


    sf::RenderWindow& Window::getSFMLWindow() {
        return this->SFML_Window;
    }
}

Как вы можете видеть, мой класс Window был очень минимальным, и я, вероятно, собирался улучшить его, но я все еще не понимаю, как это вызвало бы проблему. Может быть, потому что окно было создано в другом классе, чем Game? Но функции clear() и display() все еще работали, поэтому я не знаю.

...