diff options
| author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-12-07 14:19:16 +0100 | 
|---|---|---|
| committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-12-07 14:19:16 +0100 | 
| commit | a73ff31b67faa7e6a922cfb5598f56f80bc01d62 (patch) | |
| tree | 04840dfbdbe6207100fbbc2aba04f48a46de1022 /src/crepe/manager/LoopTimerManager.h | |
| parent | a0070890fcdb422db85660fc44bcc709832870b8 (diff) | |
added loopTimer and eventManager to mediator and removed the singletons
Diffstat (limited to 'src/crepe/manager/LoopTimerManager.h')
| -rw-r--r-- | src/crepe/manager/LoopTimerManager.h | 133 | 
1 files changed, 133 insertions, 0 deletions
diff --git a/src/crepe/manager/LoopTimerManager.h b/src/crepe/manager/LoopTimerManager.h new file mode 100644 index 0000000..dba0f66 --- /dev/null +++ b/src/crepe/manager/LoopTimerManager.h @@ -0,0 +1,133 @@ +#pragma once + +#include <chrono> +#include "../manager/Manager.h" +namespace crepe { + +class LoopTimerManager : public Manager { +public: +	LoopTimerManager(Mediator & mediator); +	/** +	 * \brief Get the current delta time for the current frame. +	 * +	 * \return Delta time in seconds since the last frame. +	 */ +	double get_delta_time() const; + +	/** +	 * \brief Get the current game time. +	 * +	 * \note The current game time may vary from real-world elapsed time. It is the cumulative +	 * sum of each frame's delta time. +	 * +	 * \return Elapsed game time in seconds. +	 */ +	double get_current_time() const; + +	/** +	 * \brief Set the target frames per second (FPS). +	 * +	 * \param fps The desired frames rendered per second. +	 */ +	void set_target_fps(int fps); + +	/** +	 * \brief Get the current frames per second (FPS). +	 * +	 * \return Current FPS. +	 */ +	int get_fps() const; + +	/** +	 * \brief Get the current time scale. +	 * +	 * \return The current time scale, where 0 = paused, 1 = normal speed, and values > 1 speed +	 * up the game. +	 */ +	double get_time_scale() const; + +	/** +	 * \brief Set the time scale. +	 * +	 * \param game_scale The desired time scale (0 = pause, 1 = normal speed, > 1 = speed up). +	 */ +	void set_time_scale(double game_scale); + +private: +	friend class LoopManager; + +	/** +	 * \brief Start the loop timer. +	 * +	 * Initializes the timer to begin tracking frame times. +	 */ +	void start(); +	/** +	 * \brief Enforce the frame rate limit. +	 * +	 * Ensures that the game loop does not exceed the target FPS by delaying frame updates as +	 * necessary. +	 */ +	void enforce_frame_rate(); + +	/** +	 * \brief Get the fixed delta time for consistent updates. +	 * +	 * Fixed delta time is used for operations that require uniform time steps, such as physics +	 * calculations. +	 * +	 * \return Fixed delta time in seconds. +	 */ +	double get_fixed_delta_time() const; + +	/** +	 * \brief Get the accumulated lag in the game loop. +	 * +	 * Lag represents the difference between the target frame time and the actual frame time, +	 * useful for managing fixed update intervals. +	 * +	 * \return Accumulated lag in seconds. +	 */ +	double get_lag() const; + +	/** +	 * \brief Update the timer to the current frame. +	 * +	 * Calculates and updates the delta time for the current frame and adds it to the cumulative +	 * game time. +	 */ +	void update(); + +	/** +	 * \brief Advance the game loop by a fixed update interval. +	 * +	 * This method progresses the game state by a consistent, fixed time step, allowing for +	 * stable updates independent of frame rate fluctuations. +	 */ +	void advance_fixed_update(); + +private: +	//! Target frames per second +	int target_fps = 50; +	//! Actual frames per second +	int actual_fps = 0; +	//! Current game scale +	double game_scale = 1; +	//! Maximum delta time in seconds to avoid large jumps +	std::chrono::duration<double> maximum_delta_time{0.25}; +	//! Delta time for the current frame in seconds +	std::chrono::duration<double> delta_time{0.0}; +	//! Target time per frame in seconds +	std::chrono::duration<double> frame_target_time +		= std::chrono::duration<double>(1.0) / target_fps; +	//! Fixed delta time for fixed updates in seconds +	std::chrono::duration<double> fixed_delta_time = std::chrono::duration<double>(1.0) / 50.0; +	//! Total elapsed game time in seconds +	std::chrono::duration<double> elapsed_time{0.0}; +	//! Total elapsed time for fixed updates in seconds +	std::chrono::duration<double> elapsed_fixed_time{0.0}; +	//! Time of the last frame +	std::chrono::steady_clock::time_point last_frame_time; +}; + +} // namespace crepe  |