[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