6 #include "./platforms.h"
11 typedef enum game_state_t {
12 GAME_STATE_RUNNING = 0,
19 typedef struct game_t {
22 platforms_t *platforms;
24 char *level_file_path;
27 game_t *create_game(const char *level_file_path)
29 assert(level_file_path);
31 game_t *game = malloc(sizeof(game_t));
33 throw_error(ERROR_TYPE_LIBC);
34 goto malloc_game_failed;
37 if ((game->player = create_player(100.0f, 0.0f)) == NULL) {
38 goto create_player_failed;
41 if ((game->platforms = load_platforms_from_file(level_file_path)) == NULL) {
42 goto create_platforms_failed;
45 if ((game->camera = create_camera(vec(0.0f, 0.0f))) == NULL) {
46 goto create_camera_failed;
49 if ((game->level_file_path = malloc(sizeof(char) * strlen(level_file_path))) == NULL) {
50 goto malloc_level_file_name_failed;
53 strcpy(game->level_file_path, level_file_path);
55 game->state = GAME_STATE_RUNNING;
59 malloc_level_file_name_failed:
62 free(game->platforms);
63 create_platforms_failed:
71 void destroy_game(game_t *game)
75 if (game->level_file_path) { free(game->level_file_path); }
76 if (game->camera) { free(game->camera); }
77 if (game->platforms) { free(game->platforms); }
78 if (game->player) { free(game->player); }
83 int game_render(const game_t *game, SDL_Renderer *renderer)
88 if (game->state == GAME_STATE_QUIT) {
92 if (SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255) < 0) {
93 throw_error(ERROR_TYPE_SDL2);
97 if (SDL_RenderClear(renderer) < 0) {
98 throw_error(ERROR_TYPE_SDL2);
102 if (render_player(game->player, renderer, game->camera) < 0) {
106 if (render_platforms(game->platforms, renderer, game->camera) < 0) {
110 SDL_RenderPresent(renderer);
115 int game_update(game_t *game, Uint32 delta_time)
118 assert(delta_time > 0);
120 if (game->state == GAME_STATE_QUIT) {
124 update_player(game->player, game->platforms, delta_time);
125 player_focus_camera(game->player, game->camera);
130 int game_event(game_t *game, const SDL_Event *event)
135 if (game->state == GAME_STATE_QUIT) {
139 switch (event->type) {
141 game->state = GAME_STATE_QUIT;
145 switch (event->key.keysym.sym) {
147 player_jump(game->player);
151 printf("Reloading the level from '%s'...", game->level_file_path);
153 destroy_platforms(game->platforms);
154 game->platforms = load_platforms_from_file(game->level_file_path);
156 if (game->platforms == NULL) {
157 print_current_error_msg("Could not reload the level");
158 game->state = GAME_STATE_QUIT;
165 case SDL_JOYBUTTONDOWN:
166 if (event->jbutton.button == 1) {
167 player_jump(game->player);
175 int game_input(game_t *game,
176 const Uint8 *const keyboard_state,
177 SDL_Joystick *the_stick_of_joy)
180 assert(keyboard_state);
181 assert(the_stick_of_joy);
183 if (game->state == GAME_STATE_QUIT) {
187 if (keyboard_state[SDL_SCANCODE_A]) {
188 player_move_left(game->player);
189 } else if (keyboard_state[SDL_SCANCODE_D]) {
190 player_move_right(game->player);
191 } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
192 player_move_left(game->player);
193 } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
194 player_move_right(game->player);
196 player_stop(game->player);
202 int is_game_over(const game_t *game)
204 return game->state == GAME_STATE_QUIT;