6 #include "./platforms.h"
12 typedef enum game_state_t {
13 GAME_STATE_RUNNING = 0,
20 typedef struct game_t {
25 platforms_t *platforms;
27 char *level_file_path;
30 game_t *create_game(const char *level_file_path)
32 assert(level_file_path);
34 lt_t *const lt = create_lt();
39 game_t *game = PUSH_LT(lt, malloc(sizeof(game_t)), free);
41 throw_error(ERROR_TYPE_LIBC);
45 game->player = PUSH_LT(lt, create_player(100.0f, 0.0f), destroy_player);
46 if (game->player == NULL) {
50 game->platforms = PUSH_LT(lt, load_platforms_from_file(level_file_path), destroy_platforms);
51 if (game->platforms == NULL) {
55 game->camera = PUSH_LT(lt, create_camera(vec(0.0f, 0.0f)), destroy_camera);
56 if (game->camera == NULL) {
60 game->level_file_path = PUSH_LT(lt, malloc(sizeof(char) * (strlen(level_file_path) + 1)), free);
61 if (game->level_file_path == NULL) {
62 throw_error(ERROR_TYPE_LIBC);
66 strcpy(game->level_file_path, level_file_path);
68 game->state = GAME_STATE_RUNNING;
74 void destroy_game(game_t *game)
80 int game_render(const game_t *game, SDL_Renderer *renderer)
85 if (game->state == GAME_STATE_QUIT) {
89 if (SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255) < 0) {
90 throw_error(ERROR_TYPE_SDL2);
94 if (SDL_RenderClear(renderer) < 0) {
95 throw_error(ERROR_TYPE_SDL2);
99 if (render_player(game->player, renderer, game->camera) < 0) {
103 if (render_platforms(game->platforms, renderer, game->camera) < 0) {
107 SDL_RenderPresent(renderer);
112 int game_update(game_t *game, Uint32 delta_time)
115 assert(delta_time > 0);
117 if (game->state == GAME_STATE_QUIT) {
121 if (game->state == GAME_STATE_RUNNING) {
122 update_player(game->player, game->platforms, delta_time);
123 player_focus_camera(game->player, game->camera);
130 static int game_event_pause(game_t *game, const SDL_Event *event)
135 switch (event->type) {
137 game->state = GAME_STATE_QUIT;
141 switch (event->key.keysym.sym) {
143 game->state = GAME_STATE_RUNNING;
152 static int game_event_running(game_t *game, const SDL_Event *event)
157 switch (event->type) {
159 game->state = GAME_STATE_QUIT;
163 switch (event->key.keysym.sym) {
165 player_jump(game->player);
169 printf("Reloading the level from '%s'...", game->level_file_path);
171 game->platforms = RESET_LT(
174 load_platforms_from_file(game->level_file_path));
176 if (game->platforms == NULL) {
177 print_current_error_msg("Could not reload the level");
178 game->state = GAME_STATE_QUIT;
184 game->state = GAME_STATE_PAUSE;
189 case SDL_JOYBUTTONDOWN:
190 if (event->jbutton.button == 1) {
191 player_jump(game->player);
199 int game_event(game_t *game, const SDL_Event *event)
204 switch (game->state) {
205 case GAME_STATE_RUNNING:
206 return game_event_running(game, event);
208 case GAME_STATE_PAUSE:
209 return game_event_pause(game, event);
218 int game_input(game_t *game,
219 const Uint8 *const keyboard_state,
220 SDL_Joystick *the_stick_of_joy)
223 assert(keyboard_state);
224 assert(the_stick_of_joy);
226 if (game->state == GAME_STATE_QUIT || game->state == GAME_STATE_PAUSE) {
230 if (keyboard_state[SDL_SCANCODE_A]) {
231 player_move_left(game->player);
232 } else if (keyboard_state[SDL_SCANCODE_D]) {
233 player_move_right(game->player);
234 } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
235 player_move_left(game->player);
236 } else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
237 player_move_right(game->player);
239 player_stop(game->player);
245 int is_game_over(const game_t *game)
247 return game->state == GAME_STATE_QUIT;