В этом проекте у меня есть класс 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()
все еще работали, поэтому я не знаю.