Move relevant logic to level entity
parent
1622699235
commit
b1f0a048d3
63
src/game.c
63
src/game.c
|
@ -7,6 +7,7 @@
|
|||
#include "./camera.h"
|
||||
#include "./game.h"
|
||||
#include "./error.h"
|
||||
#include "./level.h"
|
||||
#include "./lt.h"
|
||||
|
||||
typedef enum game_state_t {
|
||||
|
@ -21,8 +22,7 @@ typedef struct game_t {
|
|||
lt_t *lt;
|
||||
|
||||
game_state_t state;
|
||||
player_t *player;
|
||||
platforms_t *platforms;
|
||||
level_t *level;
|
||||
camera_t *camera;
|
||||
char *level_file_path;
|
||||
} game_t;
|
||||
|
@ -42,13 +42,21 @@ game_t *create_game(const char *level_file_path)
|
|||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
|
||||
game->player = PUSH_LT(lt, create_player(100.0f, 0.0f), destroy_player);
|
||||
if (game->player == NULL) {
|
||||
player_t *const player = PUSH_LT(lt, create_player(100.0f, 0.0f), destroy_player);
|
||||
if (player == NULL) {
|
||||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
|
||||
game->platforms = PUSH_LT(lt, load_platforms_from_file(level_file_path), destroy_platforms);
|
||||
if (game->platforms == NULL) {
|
||||
platforms_t *const platforms = PUSH_LT(lt, load_platforms_from_file(level_file_path), destroy_platforms);
|
||||
if (platforms == NULL) {
|
||||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
|
||||
game->level = PUSH_LT(
|
||||
lt,
|
||||
create_level(RELEASE_LT(lt, player), RELEASE_LT(lt, platforms)),
|
||||
destroy_level);
|
||||
if (game->level == NULL) {
|
||||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
|
||||
|
@ -96,11 +104,7 @@ int game_render(const game_t *game, SDL_Renderer *renderer)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (render_player(game->player, renderer, game->camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (render_platforms(game->platforms, renderer, game->camera) < 0) {
|
||||
if (level_render(game->level, game->camera, renderer) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -119,8 +123,7 @@ int game_update(game_t *game, Uint32 delta_time)
|
|||
}
|
||||
|
||||
if (game->state == GAME_STATE_RUNNING) {
|
||||
update_player(game->player, game->platforms, delta_time);
|
||||
player_focus_camera(game->player, game->camera);
|
||||
return level_update(game->level, game->camera, delta_time);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -149,7 +152,7 @@ static int game_event_pause(game_t *game, const SDL_Event *event)
|
|||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return level_event(game->level, event);
|
||||
}
|
||||
|
||||
static int game_event_running(game_t *game, const SDL_Event *event)
|
||||
|
@ -164,19 +167,10 @@ static int game_event_running(game_t *game, const SDL_Event *event)
|
|||
|
||||
case SDL_KEYDOWN:
|
||||
switch (event->key.keysym.sym) {
|
||||
case SDLK_SPACE:
|
||||
player_jump(game->player);
|
||||
break;
|
||||
|
||||
case SDLK_q:
|
||||
printf("Reloading the level from '%s'...\n", game->level_file_path);
|
||||
|
||||
game->platforms = RESET_LT(
|
||||
game->lt,
|
||||
game->platforms,
|
||||
load_platforms_from_file(game->level_file_path));
|
||||
|
||||
if (game->platforms == NULL) {
|
||||
if (level_reload_platforms(game->level, game->level_file_path) < 0) {
|
||||
print_current_error_msg("Could not reload the level");
|
||||
game->state = GAME_STATE_QUIT;
|
||||
return -1;
|
||||
|
@ -193,14 +187,9 @@ static int game_event_running(game_t *game, const SDL_Event *event)
|
|||
}
|
||||
break;
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
if (event->jbutton.button == 1) {
|
||||
player_jump(game->player);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return level_event(game->level, event);
|
||||
}
|
||||
|
||||
int game_event(game_t *game, const SDL_Event *event)
|
||||
|
@ -233,19 +222,7 @@ int game_input(game_t *game,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (keyboard_state[SDL_SCANCODE_A]) {
|
||||
player_move_left(game->player);
|
||||
} else if (keyboard_state[SDL_SCANCODE_D]) {
|
||||
player_move_right(game->player);
|
||||
} else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
|
||||
player_move_left(game->player);
|
||||
} else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
|
||||
player_move_right(game->player);
|
||||
} else {
|
||||
player_stop(game->player);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return level_input(game->level, keyboard_state, the_stick_of_joy);
|
||||
}
|
||||
|
||||
int is_game_over(const game_t *game)
|
||||
|
|
58
src/level.c
58
src/level.c
|
@ -5,6 +5,7 @@
|
|||
#include "./player.h"
|
||||
#include "./platforms.h"
|
||||
#include "./level.h"
|
||||
#include "./camera.h"
|
||||
#include "./error.h"
|
||||
|
||||
struct level_t
|
||||
|
@ -36,7 +37,7 @@ level_t *create_level(player_t *player,
|
|||
level->platforms = PUSH_LT(lt, platforms, destroy_platforms);
|
||||
level->lt = lt;
|
||||
|
||||
return NULL;
|
||||
return level;
|
||||
}
|
||||
|
||||
void destroy_level(level_t *level)
|
||||
|
@ -45,18 +46,30 @@ void destroy_level(level_t *level)
|
|||
RETURN_LT0(level->lt);
|
||||
}
|
||||
|
||||
int level_render(const level_t *level, SDL_Renderer *renderer)
|
||||
int level_render(const level_t *level, camera_t *camera, SDL_Renderer *renderer)
|
||||
{
|
||||
assert(level);
|
||||
assert(renderer);
|
||||
|
||||
if (render_player(level->player, renderer, camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (render_platforms(level->platforms, renderer, camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int level_update(level_t *level, Uint32 delta_time)
|
||||
int level_update(level_t *level, camera_t *camera, Uint32 delta_time)
|
||||
{
|
||||
assert(level);
|
||||
assert(delta_time > 0);
|
||||
|
||||
update_player(level->player, level->platforms, delta_time);
|
||||
player_focus_camera(level->player, camera);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -65,6 +78,22 @@ int level_event(level_t *level, const SDL_Event *event)
|
|||
assert(level);
|
||||
assert(event);
|
||||
|
||||
switch (event->type) {
|
||||
case SDL_KEYDOWN:
|
||||
switch (event->key.keysym.sym) {
|
||||
case SDLK_SPACE:
|
||||
player_jump(level->player);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
if (event->jbutton.button == 1) {
|
||||
player_jump(level->player);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -76,12 +105,31 @@ int level_input(level_t *level,
|
|||
assert(keyboard_state);
|
||||
(void) the_stick_of_joy;
|
||||
|
||||
if (keyboard_state[SDL_SCANCODE_A]) {
|
||||
player_move_left(level->player);
|
||||
} else if (keyboard_state[SDL_SCANCODE_D]) {
|
||||
player_move_right(level->player);
|
||||
} else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) < 0) {
|
||||
player_move_left(level->player);
|
||||
} else if (the_stick_of_joy && SDL_JoystickGetAxis(the_stick_of_joy, 0) > 0) {
|
||||
player_move_right(level->player);
|
||||
} else {
|
||||
player_stop(level->player);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_level_over(const level_t *level)
|
||||
int level_reload_platforms(level_t *level, const char *file_name)
|
||||
{
|
||||
assert(level);
|
||||
level->platforms = RESET_LT(
|
||||
level->lt,
|
||||
level->platforms,
|
||||
load_platforms_from_file(file_name));
|
||||
|
||||
if (level->platforms == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -7,19 +7,19 @@ typedef struct player_t player_t;
|
|||
typedef struct platforms_t platforms_t;
|
||||
typedef struct SDL_Renderer SDL_Renderer;
|
||||
typedef union SDL_Event SDL_Event;
|
||||
typedef struct camera_t camera_t;
|
||||
|
||||
level_t *create_level(player_t *player,
|
||||
platforms_t *platforms);
|
||||
void destroy_level(level_t *level);
|
||||
|
||||
int level_render(const level_t *level, SDL_Renderer *renderer);
|
||||
int level_update(level_t *level, Uint32 delta_time);
|
||||
int level_render(const level_t *level, camera_t *camera, SDL_Renderer *renderer);
|
||||
int level_update(level_t *level, camera_t *camera, Uint32 delta_time);
|
||||
|
||||
int level_event(level_t *level, const SDL_Event *event);
|
||||
int level_input(level_t *level,
|
||||
const Uint8 *const keyboard_state,
|
||||
SDL_Joystick *the_stick_of_joy);
|
||||
|
||||
int is_level_over(const level_t *level);
|
||||
int level_reload_platforms(level_t *level, const char *file_name);
|
||||
|
||||
#endif // LEVEL_H_
|
||||
|
|
Loading…
Reference in New Issue