diff --git a/Cell.hpp b/Cell.hpp index a1bcf52..33c5644 100644 --- a/Cell.hpp +++ b/Cell.hpp @@ -10,8 +10,8 @@ class Cell : public Drawable bool CreateSprite(); public: Cell(); - Cell(unsigned int, unsigned int, unsigned int = 1); - void Set(unsigned int, unsigned int, unsigned int = 1); + Cell(unsigned int, unsigned int, unsigned int = 0); + void Set(unsigned int, unsigned int, unsigned int = 0); void UpdateSprite(unsigned int); void UpdateRotation(unsigned); void Draw(sf::RenderWindow *); @@ -47,7 +47,8 @@ bool Cell::CreateSprite() void Cell::UpdateSprite(unsigned int index) { if(index == spriteIndex) return; - sprite.setTextureRect(GameManager::GetConfig() -> GetSpriteRect(index)); + spriteIndex = index; + sprite.setTextureRect(GameManager::GetConfig() -> GetSpriteRect(spriteIndex)); } void Cell::UpdateRotation(unsigned direction) diff --git a/Data/SpriteSheet.png b/Data/SpriteSheet.png index 9305bcc..9aa6a4f 100644 Binary files a/Data/SpriteSheet.png and b/Data/SpriteSheet.png differ diff --git a/GameConfiguration.hpp b/GameConfiguration.hpp index 47081a3..0732006 100644 --- a/GameConfiguration.hpp +++ b/GameConfiguration.hpp @@ -28,6 +28,7 @@ class GameConfiguration public: GameConfiguration(); GameConfiguration(std::string = std::string()); + bool IsFullscreen(); float GetSpriteSizeMultiplier(); float GetAudioVolume(); sf::Color GetBackgroundColor(); @@ -190,18 +191,15 @@ void GameConfiguration::WriteValuesToFile(std::string path) void GameConfiguration::LoadDefaultValues() { windowDimensions = sf::Vector2i(800, 600); - // !! Placeholder values! Change after real sprites are added! !! - spriteSizeMultiplier = 1.0; - backgroundColor = sf::Color::White; gridSize = sf::Vector2i(10, 10); LoadSpriteSheet("Data\\SpriteSheet.png"); - // !! Placeholder values! Change after real sprites are added! !! - spriteSheetCellSize = sf::Vector2i(50, 50); + spriteSheetCellSize = sf::Vector2i(64, 64); + spriteSizeMultiplier = 1.0; + fullscreen = false; - audioVolume = 1.0; } @@ -234,6 +232,11 @@ sf::IntRect GameConfiguration::GetSpriteRect(unsigned int index) return spriteSheetRect; } +bool GameConfiguration::IsFullscreen() +{ + return fullscreen; +} + sf::Vector2i GameConfiguration::GetGridSize() { return gridSize; diff --git a/GameManager.hpp b/GameManager.hpp index 95e0840..736acd4 100644 --- a/GameManager.hpp +++ b/GameManager.hpp @@ -5,13 +5,27 @@ class GameManager { private: static GameConfiguration *config; + static unsigned lastInputDirection; public: + static void KeyPress(sf::Keyboard::Key); static void SetConfig(GameConfiguration &); static GameConfiguration *GetConfig(); }; GameConfiguration *GameManager::config = NULL; +unsigned GameManager::lastInputDirection = 0; + +void GameManager::KeyPress(sf::Keyboard::Key keycode) +{ + switch (keycode) + { + case sf::Keyboard::Key::Right: case sf::Keyboard::Key::D: GameManager::lastInputDirection = 0; break; + case sf::Keyboard::Key::Down: case sf::Keyboard::Key::S: GameManager::lastInputDirection = 1; break; + case sf::Keyboard::Key::Left: case sf::Keyboard::Key::A: GameManager::lastInputDirection = 2; break; + case sf::Keyboard::Key::Up: case sf::Keyboard::Key::W: GameManager::lastInputDirection = 3; break; + } +} void GameManager::SetConfig(GameConfiguration &config) { diff --git a/GameWindow.hpp b/GameWindow.hpp index 875d878..eb0526b 100644 --- a/GameWindow.hpp +++ b/GameWindow.hpp @@ -3,17 +3,97 @@ class GameWindow { private: + sf::Event event; sf::Vector2i windowDimensions; + std::string title; + sf::Uint32 style; sf::RenderWindow window; + Timer timer; + GameConfiguration *config; + Drawable *drawable; + void (Drawable::*draw)(sf::RenderWindow *); + bool isFocused; + bool fullscreen; + void CreateWindow(); + void CloseWindow(); public: - GameWindow(/* args */); + GameWindow(std::string = "Window", sf::Uint32 = sf::Style::Titlebar | sf::Style::Close); + void BindDrawable(Drawable *, void (Drawable::*)(sf::RenderWindow *)); + void Update(); + bool IsOpen(); ~GameWindow(); }; -GameWindow::GameWindow(/* args */) +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()); + ((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.ResetTimer(); +} + +void GameWindow::CloseWindow() +{ + if(!window.isOpen()) + return; + + window.close(); +} + +void GameWindow::BindDrawable(Drawable *drawable, void (Drawable::*draw)(sf::RenderWindow *)) +{ + this -> drawable = drawable; + this -> draw = draw; +} + +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(); } diff --git a/SynEngine.hpp b/SynEngine.hpp index 9a8f7e6..fe19b24 100644 --- a/SynEngine.hpp +++ b/SynEngine.hpp @@ -5,6 +5,7 @@ #include #include #include + #include "Timer.hpp" #include "GameManager.hpp" #include "GameConfiguration.hpp" #include "Drawable.hpp" diff --git a/Timer.hpp b/Timer.hpp new file mode 100644 index 0000000..29ad2f0 --- /dev/null +++ b/Timer.hpp @@ -0,0 +1,47 @@ +#include "SynEngine.hpp" + +class Timer +{ + private: + sf::Clock clock; + float deltaTime; + float timePassed; + public: + Timer(); + void ResetTimer(); + void UpdateTime(); + float GetDeltaTime(); + float GetTimePassed(); +}; + +Timer::Timer() +{ + clock.restart(); + timePassed = 0.0; + deltaTime = 0.0; +} + +void Timer::ResetTimer() +{ + clock.restart(); + timePassed = 0.0; + deltaTime = 0.0; +} + +void Timer::UpdateTime() +{ + float newTimePassed = clock.getElapsedTime().asSeconds(); + + deltaTime = newTimePassed - timePassed; + timePassed = newTimePassed; +} + +float Timer::GetDeltaTime() +{ + return deltaTime; +} + +float Timer::GetTimePassed() +{ + return timePassed; +} diff --git a/main.cpp b/main.cpp index 8908208..19ec67c 100644 --- a/main.cpp +++ b/main.cpp @@ -4,20 +4,17 @@ int main(int argc, char const *argv[]) { GameConfiguration config = GameConfiguration("Configurations"); GameManager::SetConfig(config); + GameWindow window("Long Starlight"); Grid grid = Grid(); + grid.SetGrid(); + window.BindDrawable(&grid, &Drawable::Draw); - sf::RenderWindow render(sf::VideoMode(800, 600), "Test"); + grid.UpdateCell(0, 0, 2); + grid.UpdateCell(0, 1, 2, 1); - if (render.isOpen()) // Quick Test - { - render.clear(config.GetBackgroundColor()); - grid.UpdateCell(0, 0, 2); - grid.UpdateCell(0, 1, 2, 1); - grid.Draw(&render); - render.display(); - sf::sleep(sf::milliseconds(5000)); - } + while (window.IsOpen()) + window.Update(); std::cout << "/)(\\"; return 0;