[Add] Implement delta time game loop.
This commit is contained in:
parent
d602a8f1d4
commit
caa482a7a0
@ -94,11 +94,11 @@ void GameState::handle_event(SDL_Event* event, int screen_width, int screen_heig
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameState::update(void) {
|
void GameState::update(float dt) {
|
||||||
switch(_current_screen) {
|
switch(_current_screen) {
|
||||||
case Screen::MAIN_MENU: {
|
case Screen::MAIN_MENU: {
|
||||||
if(!_main_menu) break;
|
if(!_main_menu) break;
|
||||||
Screen next_screen = _main_menu->update();
|
Screen next_screen = _main_menu->update(dt);
|
||||||
if(next_screen != Screen::MAIN_MENU) {
|
if(next_screen != Screen::MAIN_MENU) {
|
||||||
const MenuButton* clicked_button = _main_menu->get_clicked_button();
|
const MenuButton* clicked_button = _main_menu->get_clicked_button();
|
||||||
if(clicked_button) {
|
if(clicked_button) {
|
||||||
@ -196,7 +196,7 @@ void GameState::update(void) {
|
|||||||
* TODO: These fuck'in window dimensions just need to be global at this point!!
|
* TODO: These fuck'in window dimensions just need to be global at this point!!
|
||||||
* Pass GameState by reference ?
|
* Pass GameState by reference ?
|
||||||
*/
|
*/
|
||||||
_desktop->update(_screen_width, _screen_height);
|
_desktop->update(dt, _screen_width, _screen_height);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@ public:
|
|||||||
void init(int screen_width, int screen_height);
|
void init(int screen_width, int screen_height);
|
||||||
void start_single_player_now(int screen_width, int screen_height);
|
void start_single_player_now(int screen_width, int screen_height);
|
||||||
void handle_event(SDL_Event* event, int screen_width, int screen_height);
|
void handle_event(SDL_Event* event, int screen_width, int screen_height);
|
||||||
void update(void);
|
void update(float dt);
|
||||||
void render(const RenderContext& context);
|
void render(const RenderContext& context);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
#include <SDL3/SDL_keyboard.h>
|
#include <SDL3/SDL_keyboard.h>
|
||||||
|
#include <SDL3/SDL_timer.h>
|
||||||
|
|
||||||
#include "gfx/shape_renderer.h"
|
#include "gfx/shape_renderer.h"
|
||||||
#include "gfx/txt_renderer.h"
|
#include "gfx/txt_renderer.h"
|
||||||
@ -94,6 +95,10 @@ int main(int argc, char** argv) {
|
|||||||
Uint32 last_blink_time = 0;
|
Uint32 last_blink_time = 0;
|
||||||
bool show_cursor = true;
|
bool show_cursor = true;
|
||||||
|
|
||||||
|
/* Timestep. */
|
||||||
|
Uint64 last_frame_time = SDL_GetPerformanceCounter();
|
||||||
|
float dt = 0.0f;
|
||||||
|
|
||||||
bool running = true;
|
bool running = true;
|
||||||
while(running) {
|
while(running) {
|
||||||
/* Event handling. */
|
/* Event handling. */
|
||||||
@ -103,7 +108,15 @@ int main(int argc, char** argv) {
|
|||||||
game_state->handle_event(&event, SCREEN_WIDTH, SCREEN_HEIGHT);
|
game_state->handle_event(&event, SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
game_state->update();
|
/* Calculate delta time. */
|
||||||
|
Uint64 current_frame_time = SDL_GetPerformanceCounter();
|
||||||
|
dt = (current_frame_time - last_frame_time) / (float)SDL_GetPerformanceFrequency();
|
||||||
|
last_frame_time = current_frame_time;
|
||||||
|
|
||||||
|
/* Clamp dt to avoid large jumps. */
|
||||||
|
if(dt > 0.1f) dt = 0.1f;
|
||||||
|
|
||||||
|
game_state->update(dt);
|
||||||
|
|
||||||
Uint32 current_time = SDL_GetTicks();
|
Uint32 current_time = SDL_GetTicks();
|
||||||
if(current_time - last_blink_time > 500) { /* Every 500ms. */
|
if(current_time - last_blink_time > 500) { /* Every 500ms. */
|
||||||
|
|||||||
@ -162,7 +162,7 @@ void Desktop::handle_event(SDL_Event* event, int screen_width, int screen_height
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Desktop::update(int screen_width, int screen_height) {
|
void Desktop::update(float dt, int screen_width, int screen_height) {
|
||||||
/* Remove closed windows. */
|
/* Remove closed windows. */
|
||||||
if(_focused_window) {
|
if(_focused_window) {
|
||||||
IWindowContent* content = _focused_window->get_content();
|
IWindowContent* content = _focused_window->get_content();
|
||||||
@ -189,7 +189,7 @@ void Desktop::update(int screen_width, int screen_height) {
|
|||||||
window->update();
|
window->update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_update_wallpaper(screen_width, screen_height);
|
_update_wallpaper(dt, screen_width, screen_height);
|
||||||
_windows.erase(std::remove_if(_windows.begin(), _windows.end(),
|
_windows.erase(std::remove_if(_windows.begin(), _windows.end(),
|
||||||
[this](const std::unique_ptr<UIWindow>& w) {
|
[this](const std::unique_ptr<UIWindow>& w) {
|
||||||
if (w->should_close()) {
|
if (w->should_close()) {
|
||||||
@ -237,9 +237,9 @@ void Desktop::_render_wallpaper(UIRenderer* ui_renderer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Desktop::_update_wallpaper(int screen_width, int screen_height) {
|
void Desktop::_update_wallpaper(float dt, int screen_width, int screen_height) {
|
||||||
for(auto& line : _background_text) {
|
for(auto& line : _background_text) {
|
||||||
line.y_precise -= line.speed;
|
line.y_precise -= line.speed * dt * 100.0f;
|
||||||
line.render_y = static_cast<int>(std::round(line.y_precise));
|
line.render_y = static_cast<int>(std::round(line.y_precise));
|
||||||
if(line.render_y < 0) {
|
if(line.render_y < 0) {
|
||||||
line.y_precise = screen_height;
|
line.y_precise = screen_height;
|
||||||
|
|||||||
@ -27,7 +27,7 @@ public:
|
|||||||
|
|
||||||
void add_window(std::unique_ptr<UIWindow> window);
|
void add_window(std::unique_ptr<UIWindow> window);
|
||||||
void handle_event(SDL_Event* event, int screen_width, int screen_height);
|
void handle_event(SDL_Event* event, int screen_width, int screen_height);
|
||||||
void update(int screen_width, int screen_height);
|
void update(float dt, int screen_width, int screen_height);
|
||||||
void render(const RenderContext& context);
|
void render(const RenderContext& context);
|
||||||
|
|
||||||
UIWindow* get_focused_window(void);
|
UIWindow* get_focused_window(void);
|
||||||
@ -35,7 +35,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void _set_focused_window(UIWindow* window);
|
void _set_focused_window(UIWindow* window);
|
||||||
void _render_wallpaper(UIRenderer* ui_renderer);
|
void _render_wallpaper(UIRenderer* ui_renderer);
|
||||||
void _update_wallpaper(int screen_width, int screen_height);
|
void _update_wallpaper(float dt, int screen_width, int screen_height);
|
||||||
|
|
||||||
std::vector<std::unique_ptr<UIWindow>> _windows;
|
std::vector<std::unique_ptr<UIWindow>> _windows;
|
||||||
std::unique_ptr<Taskbar> _taskbar;
|
std::unique_ptr<Taskbar> _taskbar;
|
||||||
|
|||||||
@ -89,8 +89,8 @@ void MainMenu::handle_event(SDL_Event* event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Screen MainMenu::update(void) {
|
Screen MainMenu::update(float dt) {
|
||||||
_update_background();
|
_update_background(dt);
|
||||||
return _next_screen;
|
return _next_screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,9 +127,9 @@ void MainMenu::render(UIRenderer* ui_renderer) {
|
|||||||
ui_renderer->flush_text();
|
ui_renderer->flush_text();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::_update_background(void) {
|
void MainMenu::_update_background(float dt) {
|
||||||
for(auto& line : _background_text) {
|
for(auto& line : _background_text) {
|
||||||
line.y -= line.speed;
|
line.y -= line.speed * dt * 100.0f;
|
||||||
if(line.y < 0) {
|
if(line.y < 0) {
|
||||||
line.y = _screen_height;
|
line.y = _screen_height;
|
||||||
line.x = (float)(rand() % _screen_width);
|
line.x = (float)(rand() % _screen_width);
|
||||||
|
|||||||
@ -23,13 +23,13 @@ public:
|
|||||||
~MainMenu(void);
|
~MainMenu(void);
|
||||||
|
|
||||||
void handle_event(SDL_Event* event);
|
void handle_event(SDL_Event* event);
|
||||||
Screen update(void);
|
Screen update(float dt);
|
||||||
void render(UIRenderer* ui_renderer);
|
void render(UIRenderer* ui_renderer);
|
||||||
|
|
||||||
const MenuButton* get_clicked_button(void) const { return _clicked_button; }
|
const MenuButton* get_clicked_button(void) const { return _clicked_button; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _update_background(void);
|
void _update_background(float dt);
|
||||||
void _render_background(UIRenderer* ui_renderer);
|
void _render_background(UIRenderer* ui_renderer);
|
||||||
|
|
||||||
/* For animated background. */
|
/* For animated background. */
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user