diff --git a/client/src/game_state.cpp b/client/src/game_state.cpp index 79b51fa..9092219 100644 --- a/client/src/game_state.cpp +++ b/client/src/game_state.cpp @@ -154,7 +154,11 @@ void GameState::update(void) { } } if(_desktop) { - _desktop->update(); + /* + * TODO: These fuck'in window dimensions just need to be global at this point!! + * Pass GameState by reference ? + */ + _desktop->update(_screen_width, _screen_height); } break; } diff --git a/client/src/ui/desktop.cpp b/client/src/ui/desktop.cpp index 16f18d6..2ae6f7d 100644 --- a/client/src/ui/desktop.cpp +++ b/client/src/ui/desktop.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -40,12 +41,14 @@ Desktop::Desktop(int screen_width, int screen_height, ClientNetwork* network) { } /* Init animated background. */ - srand(time(NULL)); for(int i = 0; i < 100; ++i) { + float y_pos = (float)(rand() % screen_height); _background_text.push_back( {get_random_snippet(_snippets), (float)(rand() % screen_width), - (float)(rand() % screen_height), - (float)(rand() % 30 + 10) / 100.0f}); + y_pos, + (float)(rand() % 30 + 10) / 100.0f, + (int)y_pos + }); } } @@ -141,8 +144,9 @@ void Desktop::handle_event(SDL_Event* event, int screen_width, int screen_height } } -void Desktop::update(void) { +void Desktop::update(int screen_width, int screen_height) { /* Remove closed windows. */ + _update_wallpaper(screen_width, screen_height); _windows.erase(std::remove_if(_windows.begin(), _windows.end(), [this](const std::unique_ptr& w) { if (w->should_close()) { @@ -182,14 +186,19 @@ void Desktop::render(ShapeRenderer* shape_renderer, TextRenderer* txt_renderer, void Desktop::_render_wallpaper(TextRenderer* txt_renderer) { const Color wallpaper_color = { 0.0f, 0.15f, 0.08f }; for(auto& line : _background_text) { - line.y -= line.speed; - if(line.y < 0) { - line.y = 720; /* TODO: Use screen_height. */ - line.x = (float)(rand() % 1280); /* TODO: Use screen_width. */ - line.text = get_random_snippet(_snippets); - } - /* Round positions to nearest int to prevent jitter. */ txt_renderer->render_text(line.text.c_str(), std::round(line.x), - std::round(line.y), 1.0f, wallpaper_color); + line.render_y, 1.0f, wallpaper_color); + } +} + +void Desktop::_update_wallpaper(int screen_width, int screen_height) { + for(auto& line : _background_text) { + line.y_precise -= line.speed; + line.render_y = static_cast(std::round(line.y_precise)); + if(line.render_y < 0) { + line.y_precise = screen_height; + line.x = (float)(rand() % screen_width); + line.text = get_random_snippet(_snippets); + } } } diff --git a/client/src/ui/desktop.h b/client/src/ui/desktop.h index dc2b91b..e01efb3 100644 --- a/client/src/ui/desktop.h +++ b/client/src/ui/desktop.h @@ -15,8 +15,9 @@ struct ScrollingText { std::string text; float x; - float y; + float y_precise; /* sub-pixel animation. */ float speed; + int render_y; /* For pixel-perfect rendering. */ }; class Desktop { @@ -26,7 +27,7 @@ public: void add_window(std::unique_ptr window); void handle_event(SDL_Event* event, int screen_width, int screen_height); - void update(void); + void update(int screen_width, int screen_height); void render(ShapeRenderer* shape_renderer, TextRenderer* txt_renderer, int screen_height, bool show_cursor); @@ -35,6 +36,7 @@ public: private: void _set_focused_window(UIWindow* window); void _render_wallpaper(TextRenderer* txt_renderer); + void _update_wallpaper(int screen_width, int screen_height); std::vector> _windows; std::unique_ptr _taskbar;