#include "SynEngine.hpp" Timer GameManager::timer; class GameWindow { private: sf::Event event; sf::Vector2i windowDimensions; std::string title; sf::Uint32 style; sf::RenderWindow window; Timer *timer; GameConfiguration *config; IDrawable *drawable; void (IDrawable::*draw)(sf::RenderWindow *); IBehaviour *behaviour; void (IBehaviour::*behaviourUpdate)(); bool isFocused; bool fullscreen; void CreateWindow(); void CloseWindow(); public: GameWindow(std::string = "Window", sf::Uint32 = sf::Style::Titlebar | sf::Style::Close); void BindDrawable(IDrawable *, void (IDrawable::*)(sf::RenderWindow *)); void BindBehaviour(IBehaviour *, void (IBehaviour::*)()); void Update(); bool IsOpen(); ~GameWindow(); }; void GameWindow::Update() { while (window.pollEvent(event)) switch (event.type) { case sf::Event::Closed: CloseWindow(); break; case sf::Event::LostFocus: isFocused = false; break; case sf::Event::GainedFocus: isFocused = true; break; case sf::Event::KeyPressed: if(event.key.code == sf::Keyboard::Key::Escape) CloseWindow(); GameManager::KeyPress(event.key.code); break; } timer -> UpdateTime(); if(!isFocused) return; window.clear(config -> GetBackgroundColor()); if(behaviour) ((behaviour)->*(behaviourUpdate))(); if(drawable) ((drawable)->*(draw))(&window); window.display(); } void GameWindow::CreateWindow() { if(window.isOpen()) return; sf::VideoMode videoMode(windowDimensions.x, windowDimensions.y); window.create(videoMode, title, fullscreen ? sf::Style::Fullscreen : style); window.setVerticalSyncEnabled(true); window.setFramerateLimit(60); timer = &GameManager::timer; timer -> ResetTimer(); } void GameWindow::CloseWindow() { if(!window.isOpen()) return; window.close(); } void GameWindow::BindDrawable(IDrawable *drawable, void (IDrawable::*draw)(sf::RenderWindow *)) { this -> drawable = drawable; this -> draw = draw; } void GameWindow::BindBehaviour(IBehaviour *behaviour, void (IBehaviour::*behaviourUpdate)()) { this -> behaviour = behaviour; this -> behaviourUpdate = behaviourUpdate; } GameWindow::GameWindow(std::string title, sf::Uint32 style) { config = GameManager::GetConfig(); windowDimensions = config -> GetScreenDimensions(); fullscreen = config -> IsFullscreen(); this -> style = style; this -> title = title; isFocused = true; CreateWindow(); } bool GameWindow::IsOpen() { return window.isOpen(); } GameWindow::~GameWindow() { CloseWindow(); }