Move relevant logic to level entity

master
rexim 2018-01-03 23:52:55 +07:00
parent 1622699235
commit b1f0a048d3
3 changed files with 77 additions and 52 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -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_