Add gametime system
This commit is contained in:
		
							
								
								
									
										5
									
								
								app.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								app.c
									
									
									
									
									
								
							| @@ -2,6 +2,7 @@ | ||||
| #include "app.h" | ||||
| #include "camera.h" | ||||
| #include "entity.h" | ||||
| #include "gametime.h" | ||||
| #include "input.h" | ||||
| #include "particle.h" | ||||
| #include "physics.h" | ||||
| @@ -25,6 +26,7 @@ App *app_NewApp() { | ||||
| 	app->entity   = entity_NewSystem(app); | ||||
| 	app->camera   = camera_NewSystem(app); | ||||
| 	app->particle = particle_NewSystem(app); | ||||
| 	app->time     = gametime_NewSystem(app); | ||||
|  | ||||
| 	app->switch_level = NULL; | ||||
| 	app->clear_color  = 0; | ||||
| @@ -51,6 +53,8 @@ void app_DeleteApp(App *app) { | ||||
| 	physics_DeleteSystem(app->physics); | ||||
| 	player_DeleteSystem(app->player); | ||||
| 	camera_DeleteSystem(app->camera); | ||||
| 	particle_DeleteSystem(app->particle); | ||||
| 	gametime_DeleteSystem(app->time); | ||||
|  | ||||
| 	free(app); | ||||
| } | ||||
| @@ -64,6 +68,7 @@ void app_Advance(App *app, Duration deltaTime) { | ||||
| 	if (app->switch_level != NULL) | ||||
| 		_app_SwitchLevel(app); | ||||
|  | ||||
| 	gametime_Advance(app->time, deltaTime); | ||||
| 	particle_Advance(app->particle, deltaTime); | ||||
| 	input_Advance(app->input); | ||||
| 	player_Advance(app->player, deltaTime); | ||||
|   | ||||
							
								
								
									
										2
									
								
								app.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								app.h
									
									
									
									
									
								
							| @@ -1,6 +1,7 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "entity.h" | ||||
| #include "gametime.h" | ||||
| #include "physics.h" | ||||
| #include "player.h" | ||||
| #include "input.h" | ||||
| @@ -23,6 +24,7 @@ typedef struct _App { | ||||
| 	System_Entity   *entity; | ||||
| 	System_Camera   *camera; | ||||
| 	System_Particle *particle; | ||||
| 	System_GameTime *time; | ||||
|  | ||||
| 	char    *switch_level; | ||||
| 	uint32_t clear_color; | ||||
|   | ||||
							
								
								
									
										36
									
								
								gametime.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								gametime.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
|  | ||||
| #include "gametime.h" | ||||
| #include "types.h" | ||||
|  | ||||
|  | ||||
| System_GameTime *gametime_NewSystem(App *super) { | ||||
| 	System_GameTime *sys = zero_malloc(sizeof(System_GameTime)); | ||||
|  | ||||
| 	sys->super = super; | ||||
| 	sys->now   = GAMETIME_EPOCH; | ||||
| 	return sys; | ||||
| } | ||||
| void gametime_DeleteSystem(System_GameTime *sys) { | ||||
| 	free(sys); | ||||
| } | ||||
|  | ||||
| void gametime_Advance(System_GameTime *sys, Duration deltaTime) { | ||||
| 	sys->now += deltaTime.microseconds; | ||||
| } | ||||
|  | ||||
|  | ||||
| TimePoint gametime_Now(System_GameTime *sys) { | ||||
| 	TimePoint now = {.microseconds = sys->now}; | ||||
| 	return now; | ||||
| } | ||||
|  | ||||
| Duration gametime_Since(System_GameTime *sys, TimePoint prev) { | ||||
| 	return time_Difference(gametime_Now(sys), prev); | ||||
| } | ||||
|  | ||||
| Duration gametime_Reset(System_GameTime *sys, TimePoint *prev) { | ||||
| 	TimePoint now = gametime_Now(sys); | ||||
| 	Duration  d   = time_Difference(now, *prev); | ||||
| 	*prev         = now; | ||||
| 	return d; | ||||
| } | ||||
							
								
								
									
										40
									
								
								gametime.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								gametime.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "types.h" | ||||
| #include <stdint.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
|  | ||||
| typedef struct _App App; | ||||
|  | ||||
|  | ||||
| // GameTime starts counting at 100 seconds. | ||||
| #define GAMETIME_EPOCH ((int64_t)(100 * 1000 * 1000)) | ||||
|  | ||||
|  | ||||
| // GameTime keeps track of running (or paused) time of the game. | ||||
| typedef struct { | ||||
| 	App    *super; | ||||
| 	int64_t now; // Microseconds since object creation, adding GAMETIME_EPOCH. | ||||
| } System_GameTime; | ||||
|  | ||||
|  | ||||
| System_GameTime *gametime_NewSystem(App *super); | ||||
| void             gametime_DeleteSystem(System_GameTime *sys); | ||||
|  | ||||
| // Advance pushes the clock forwards by DeltaTime. | ||||
| void gametime_Advance(System_GameTime *sys, Duration deltaTime); | ||||
|  | ||||
|  | ||||
| // time_XXX functions, ported to GameTime. | ||||
| TimePoint gametime_Now(System_GameTime *sys); | ||||
| Duration  gametime_Since(System_GameTime *sys, TimePoint prev); | ||||
| Duration  gametime_Reset(System_GameTime *sys, TimePoint *prev); | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										6
									
								
								types.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								types.h
									
									
									
									
									
								
							| @@ -107,10 +107,14 @@ typedef struct { | ||||
| 	int64_t microseconds; | ||||
| } TimePoint; | ||||
|  | ||||
| TimePoint time_Now(); | ||||
| // No game logic should use the time_XXX functions for time. | ||||
| // Use gametime_XXX instead. | ||||
| TimePoint time_Now(); // Don't use this! | ||||
| TimePoint time_After(TimePoint now, Duration after); | ||||
| // Don't use this! | ||||
| Duration time_Since(TimePoint prev); | ||||
| Duration time_Difference(TimePoint now, TimePoint prev); | ||||
| // Don't use this! | ||||
| Duration time_Reset(TimePoint *prev); | ||||
|  | ||||
| // 1e-6 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user