In Game Time - UQcsse3200/2024-studio-2 GitHub Wiki
Game Time Management in the Day-Night Cycle System
Overview
The game utilizes a sophisticated time management system to control various time-dependent features, such as the day-night cycle, event scheduling, and gameplay mechanics that rely on time progression. The primary classes involved in this system are:
GameTime
InGameTime
DayNightCycle
The following descriptions provide an in-depth overview of these classes, their responsibilities, and how they interact within the game.
Classes
1. GameTime
Purpose:
GameTime manages the global game time, tracking the passage of time since the game started. It provides time-related utilities that are essential for updating game logic, animations, and physics simulations.
Responsibilities:
- Time Scaling: Allows adjustment of the game's time scale to speed up or slow down the passage of time (e.g., for slow-motion effects).
- Delta Time Management: Provides the time elapsed between frames, both scaled and unscaled.
- Global Time Tracking: Keeps track of the total time since the game began.
Key Methods:
getDeltaTime()
: Returns the scaled time passed since the last frame.getRawDeltaTime()
: Returns the unscaled time passed since the last frame.getTime()
: Returns the total time passed since the game started. Usage Example:
GameTime gameTime = new GameTime();
float deltaTime = gameTime.getDeltaTime();
// Use deltaTime for updating game logic
2. InGameTime
Purpose:
InGameTime
manages the in-game clock that can be paused and resumed independently of the real-world time. It is crucial for in-game events and mechanics that need to be paused (e.g., when opening a menu).
Responsibilities:
- Pause and Resume Functionality: Allows pausing and resuming the in-game time without affecting the global game time.
- In-Game Time Tracking: Keeps track of the time elapsed in the game's world, excluding any paused durations.
Key Methods:
pause()
: Pauses the in-game time.
resume()
: Resumes the in-game time.
getTime()
: Returns the current in-game time, adjusted for any paused periods.
Usage Example:
InGameTime inGameTime = new InGameTime();
inGameTime.pause();
// Game is paused
inGameTime.resume();
// Game resumes
long currentTime = inGameTime.getTime();
3. DayNightCycle
Purpose:
DayNightCycle
controls the ambient lighting and simulates the passage of day and night within the game world. It relies on InGameTime to determine the current time of day and adjusts the lighting accordingly.
Responsibilities:
- Ambient Light Adjustment: Changes the game's ambient light based on the time of day to create a realistic day-night cycle.
- Time of Day Calculation: Computes the current time of day as a normalized value between 0.0 (midnight) and 1.0 (next midnight).
- Pause and Resume Cycle: Allows pausing and resuming the day-night cycle, synchronizing with the in-game time pauses.
Key Methods:
update()
: Updates the ambient light based on the current time of day.getTimeOfDay()
: Returns the normalized time of day.pause()
: Pauses the day-night cycle.resume()
: Resumes the day-night cycle.
Usage Example:
RayHandler rayHandler = new RayHandler(world);
DayNightCycle dayNightCycle = new DayNightCycle(rayHandler);
dayNightCycle.update();
// Adjusts the ambient light based on the time of day
Interactions and Workflow
Initialization:
GameTime
is initialized at the start of the game to track the global time.
InGameTime
is initialized to manage the time within the game world, separate from real-world time.
DayNightCycle
is created with a reference to the RayHandler for controlling lighting effects.
Time Progression:
As the game runs, GameTime keeps track of the elapsed time, and InGameTime advances unless it is paused.
DayNightCycle
uses InGameTime.getTime()
to determine the current time of day and updates the ambient light accordingly.
Pausing and Resuming:
When the game is paused (e.g., the player opens a menu), InGameTime.pause()
is called.
DayNightCycle
checks if the isPaused
flag is set and skips updates when paused.
Upon resuming, InGameTime.resume()
is called, and DayNightCycle continues updating the ambient light.
Lighting Updates:
DayNightCycle.update()
is called regularly (e.g., every frame or at fixed intervals).
It calculates the time of day using getTimeOfDay()
and interpolates between predefined colors to simulate the changing sky.
The interpolated color is applied to the ambient light via RayHandler.setAmbientLight().
UML
The following UML displays the relationships between the classes regarding Time.
Sequence Diagram
The following sequence diagram displays the relationships between the methods called and illustrates the interactions between GameTime, InGameTime, DayNightCycle, RayHandler, and other components during the game's execution.