commit
c6d0abddeb
|
@ -97,6 +97,8 @@ add_executable(nothing
|
|||
src/game/level/action.h
|
||||
src/game/level_picker.c
|
||||
src/game/level_picker.h
|
||||
src/game/settings.c
|
||||
src/game/settings.h
|
||||
src/game/level_folder.h
|
||||
src/game/level_folder.c
|
||||
src/game/sound_samples.c
|
||||
|
|
58
src/game.c
58
src/game.c
|
@ -15,6 +15,7 @@
|
|||
#include "sdl/texture.h"
|
||||
#include "game/level/level_editor/background_layer.h"
|
||||
#include "game/level/level_editor.h"
|
||||
#include "game/settings.h"
|
||||
|
||||
static int game_render_cursor(const Game *game);
|
||||
|
||||
|
@ -22,6 +23,7 @@ typedef enum Game_state {
|
|||
GAME_STATE_LEVEL = 0,
|
||||
GAME_STATE_LEVEL_PICKER,
|
||||
GAME_STATE_LEVEL_EDITOR,
|
||||
GAME_STATE_SETTINGS,
|
||||
GAME_STATE_QUIT
|
||||
} Game_state;
|
||||
|
||||
|
@ -33,6 +35,7 @@ typedef struct Game {
|
|||
LevelPicker *level_picker;
|
||||
LevelEditor *level_editor;
|
||||
Level *level;
|
||||
Settings settings;
|
||||
Sound_samples *sound_samples;
|
||||
Camera camera;
|
||||
SDL_Renderer *renderer;
|
||||
|
@ -93,6 +96,8 @@ Game *create_game(const char *level_folder,
|
|||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
|
||||
game->settings = create_settings();
|
||||
|
||||
game->renderer = renderer;
|
||||
game->texture_cursor = PUSH_LT(
|
||||
lt,
|
||||
|
@ -132,36 +137,31 @@ int game_render(const Game *game)
|
|||
if (level_render(game->level, &game->camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (game_render_cursor(game) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case GAME_STATE_LEVEL_PICKER: {
|
||||
if (level_picker_render(game->level_picker, &game->camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (game_render_cursor(game) < 0) {
|
||||
return -1;
|
||||
}
|
||||
} break;
|
||||
|
||||
case GAME_STATE_LEVEL_EDITOR: {
|
||||
if (level_editor_render(game->level_editor, &game->camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
} break;
|
||||
|
||||
if (game_render_cursor(game) < 0) {
|
||||
return -1;
|
||||
}
|
||||
case GAME_STATE_SETTINGS: {
|
||||
settings_render(&game->settings, &game->camera);
|
||||
} break;
|
||||
|
||||
case GAME_STATE_QUIT: break;
|
||||
}
|
||||
|
||||
if (game_render_cursor(game) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -170,11 +170,11 @@ int game_sound(Game *game)
|
|||
switch (game->state) {
|
||||
case GAME_STATE_LEVEL:
|
||||
return level_sound(game->level, game->sound_samples);
|
||||
case GAME_STATE_LEVEL_PICKER:
|
||||
return 0;
|
||||
case GAME_STATE_LEVEL_EDITOR:
|
||||
level_editor_sound(game->level_editor, game->sound_samples);
|
||||
return 0;
|
||||
case GAME_STATE_LEVEL_PICKER:
|
||||
case GAME_STATE_SETTINGS:
|
||||
case GAME_STATE_QUIT:
|
||||
return 0;
|
||||
}
|
||||
|
@ -245,8 +245,6 @@ int game_update(Game *game, float delta_time)
|
|||
return -1;
|
||||
}
|
||||
|
||||
//TODO(#1071): Move level picker volume update to a more appropriate place
|
||||
sound_samples_update_volume(game->sound_samples, level_picker_get_volume(game->level_picker));
|
||||
game_switch_state(game, GAME_STATE_LEVEL);
|
||||
}
|
||||
|
||||
|
@ -262,6 +260,13 @@ int game_update(Game *game, float delta_time)
|
|||
level_editor_update(game->level_editor, delta_time);
|
||||
} break;
|
||||
|
||||
case GAME_STATE_SETTINGS: {
|
||||
settings_update(&game->settings, &game->camera, delta_time);
|
||||
sound_samples_update_volume(
|
||||
game->sound_samples,
|
||||
game->settings.volume_slider.value);
|
||||
} break;
|
||||
|
||||
case GAME_STATE_QUIT:
|
||||
break;
|
||||
}
|
||||
|
@ -348,6 +353,10 @@ static int game_event_level_picker(Game *game, const SDL_Event *event)
|
|||
|
||||
game_switch_state(game, GAME_STATE_LEVEL);
|
||||
} break;
|
||||
|
||||
case SDLK_s: {
|
||||
game_switch_state(game, GAME_STATE_SETTINGS);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
|
@ -415,6 +424,20 @@ int game_event(Game *game, const SDL_Event *event)
|
|||
case GAME_STATE_LEVEL_EDITOR:
|
||||
return game_event_level_editor(game, event);
|
||||
|
||||
case GAME_STATE_SETTINGS: {
|
||||
switch (event->type) {
|
||||
case SDL_KEYDOWN: {
|
||||
if (event->key.keysym.sym == SDLK_ESCAPE) {
|
||||
game_switch_state(game, GAME_STATE_LEVEL_PICKER);
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
|
||||
settings_event(&game->settings, &game->camera, event);
|
||||
return 0;
|
||||
} break;
|
||||
|
||||
case GAME_STATE_QUIT:
|
||||
return 0;
|
||||
}
|
||||
|
@ -423,6 +446,8 @@ int game_event(Game *game, const SDL_Event *event)
|
|||
}
|
||||
|
||||
|
||||
// TODO: get rid of keyboard_state (because it's a global var and can
|
||||
// be check anywhere anyway). And introduce *_joystick methods.
|
||||
int game_input(Game *game,
|
||||
const Uint8 *const keyboard_state,
|
||||
SDL_Joystick *the_stick_of_joy)
|
||||
|
@ -431,6 +456,7 @@ int game_input(Game *game,
|
|||
trace_assert(keyboard_state);
|
||||
|
||||
switch (game->state) {
|
||||
case GAME_STATE_SETTINGS:
|
||||
case GAME_STATE_QUIT:
|
||||
case GAME_STATE_LEVEL_EDITOR:
|
||||
return 0;
|
||||
|
|
|
@ -41,7 +41,7 @@ struct Level
|
|||
|
||||
LevelState state;
|
||||
LevelMetadata *metadata;
|
||||
Background *background;
|
||||
Background background;
|
||||
RigidBodies *rigid_bodies;
|
||||
Player *player;
|
||||
Platforms *platforms;
|
||||
|
@ -70,15 +70,9 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
|
|||
}
|
||||
level->lt = lt;
|
||||
|
||||
level->background = PUSH_LT(
|
||||
lt,
|
||||
create_background(
|
||||
color_picker_rgba(
|
||||
&level_editor->background_layer.color_picker)),
|
||||
destroy_background);
|
||||
if (level->background == NULL) {
|
||||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
level->background = create_background(
|
||||
color_picker_rgba(
|
||||
&level_editor->background_layer.color_picker));
|
||||
|
||||
level->rigid_bodies = PUSH_LT(lt, create_rigid_bodies(1024), destroy_rigid_bodies);
|
||||
if (level->rigid_bodies == NULL) {
|
||||
|
@ -175,7 +169,7 @@ int level_render(const Level *level, const Camera *camera)
|
|||
{
|
||||
trace_assert(level);
|
||||
|
||||
if (background_render(level->background, camera) < 0) {
|
||||
if (background_render(&level->background, camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -277,7 +271,6 @@ int level_event_idle(Level *level, const SDL_Event *event,
|
|||
|
||||
case SDLK_l: {
|
||||
camera_toggle_debug_mode(camera);
|
||||
background_toggle_debug_mode(level->background);
|
||||
} break;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -18,51 +18,10 @@ Vec2i chunk_of_point(Vec2f p)
|
|||
(int) floorf(p.y / BACKGROUND_CHUNK_HEIGHT));
|
||||
}
|
||||
|
||||
int render_chunk(const Background *background,
|
||||
const Camera *camera,
|
||||
int render_chunk(const Camera *camera,
|
||||
Vec2i chunk,
|
||||
Color color);
|
||||
|
||||
struct Background
|
||||
{
|
||||
Lt *lt;
|
||||
Color base_color;
|
||||
int debug_mode;
|
||||
};
|
||||
|
||||
Background *create_background(Color base_color)
|
||||
{
|
||||
Lt *lt = create_lt();
|
||||
|
||||
Background *background = PUSH_LT(lt, nth_calloc(1, sizeof(Background)), free);
|
||||
if (background == NULL) {
|
||||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
|
||||
background->base_color = base_color;
|
||||
background->debug_mode = 0;
|
||||
background->lt = lt;
|
||||
|
||||
return background;
|
||||
}
|
||||
|
||||
Background *create_background_from_line_stream(LineStream *line_stream)
|
||||
{
|
||||
char color[7];
|
||||
if (sscanf(line_stream_next(line_stream), "%6s", color) == EOF) {
|
||||
log_fail("Could not read background's color\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return create_background(hexstr(color));
|
||||
}
|
||||
|
||||
void destroy_background(Background *background)
|
||||
{
|
||||
trace_assert(background);
|
||||
RETURN_LT0(background->lt);
|
||||
}
|
||||
|
||||
int background_render(const Background *background,
|
||||
const Camera *camera0)
|
||||
{
|
||||
|
@ -89,7 +48,6 @@ int background_render(const Background *background,
|
|||
for (int x = min.x - 1; x <= max.x; ++x) {
|
||||
for (int y = min.y - 1; y <= max.y; ++y) {
|
||||
if (render_chunk(
|
||||
background,
|
||||
&camera,
|
||||
vec2i(x, y),
|
||||
color_darker(background->base_color, 0.05f * (float)(l + 1))) < 0) {
|
||||
|
@ -106,14 +64,13 @@ int background_render(const Background *background,
|
|||
|
||||
/* Private Function */
|
||||
|
||||
int render_chunk(const Background *background,
|
||||
const Camera *camera,
|
||||
int render_chunk(const Camera *camera,
|
||||
Vec2i chunk,
|
||||
Color color)
|
||||
{
|
||||
(void) color;
|
||||
trace_assert(camera);
|
||||
|
||||
if (background->debug_mode) {
|
||||
if (camera->debug_mode) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -140,11 +97,6 @@ int render_chunk(const Background *background,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void background_toggle_debug_mode(Background *background)
|
||||
{
|
||||
background->debug_mode = !background->debug_mode;
|
||||
}
|
||||
|
||||
Color background_base_color(const Background *background)
|
||||
{
|
||||
return background->base_color;
|
||||
|
|
|
@ -6,18 +6,22 @@
|
|||
#include "color.h"
|
||||
#include "game/camera.h"
|
||||
|
||||
typedef struct Background Background;
|
||||
typedef struct LineStream LineStream;
|
||||
|
||||
Background *create_background(Color base_color);
|
||||
Background *create_background_from_line_stream(LineStream *line_stream);
|
||||
void destroy_background(Background *background);
|
||||
typedef struct {
|
||||
Color base_color;
|
||||
} Background;
|
||||
|
||||
static inline
|
||||
Background create_background(Color base_color)
|
||||
{
|
||||
Background result = {base_color};
|
||||
return result;
|
||||
}
|
||||
|
||||
int background_render(const Background *background,
|
||||
const Camera *camera);
|
||||
|
||||
Color background_base_color(const Background *background);
|
||||
|
||||
void background_toggle_debug_mode(Background *background);
|
||||
|
||||
#endif // BACKGROUND_H_
|
||||
|
|
|
@ -19,12 +19,10 @@
|
|||
struct LevelPicker
|
||||
{
|
||||
Lt *lt;
|
||||
Background *background;
|
||||
Background background;
|
||||
Vec2f camera_position;
|
||||
LevelFolder *level_folder;
|
||||
WigglyText wiggly_text;
|
||||
Slider volume_slider;
|
||||
Vec2f volume_slider_scale;
|
||||
ListSelector *list_selector;
|
||||
};
|
||||
|
||||
|
@ -43,13 +41,7 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir
|
|||
}
|
||||
level_picker->lt = lt;
|
||||
|
||||
level_picker->background = PUSH_LT(
|
||||
lt,
|
||||
create_background(hexstr("073642")),
|
||||
destroy_background);
|
||||
if (level_picker->background == NULL) {
|
||||
RETURN_LT(lt, NULL);
|
||||
}
|
||||
level_picker->background = create_background(hexstr("073642"));
|
||||
|
||||
level_picker->camera_position = vec(0.0f, 0.0f);
|
||||
|
||||
|
@ -67,13 +59,6 @@ LevelPicker *create_level_picker(const Sprite_font *sprite_font, const char *dir
|
|||
.color = COLOR_WHITE,
|
||||
};
|
||||
|
||||
level_picker->volume_slider = (Slider) {
|
||||
.drag = 0,
|
||||
.value = 80.0f,
|
||||
.max_value = 100.0f,
|
||||
};
|
||||
level_picker->volume_slider_scale = vec(0.25f, 0.10f);
|
||||
|
||||
level_picker->list_selector = PUSH_LT(
|
||||
lt,
|
||||
create_list_selector(
|
||||
|
@ -103,7 +88,7 @@ int level_picker_render(const LevelPicker *level_picker,
|
|||
|
||||
const Rect viewport = camera_view_port_screen(camera);
|
||||
|
||||
if (background_render(level_picker->background, camera) < 0) {
|
||||
if (background_render(&level_picker->background, camera) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -138,20 +123,6 @@ int level_picker_render(const LevelPicker *level_picker,
|
|||
}
|
||||
}
|
||||
|
||||
{
|
||||
/* CSS volume */
|
||||
const Rect position = {
|
||||
.w = viewport.w * level_picker->volume_slider_scale.x,
|
||||
.h = viewport.h * level_picker->volume_slider_scale.y,
|
||||
.x = viewport.w - viewport.w * level_picker->volume_slider_scale.x - 5.0f,
|
||||
.y = 5.0f,
|
||||
};
|
||||
|
||||
/* HTML volume */
|
||||
if (slider_render(&level_picker->volume_slider, camera, position) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -177,26 +148,6 @@ int level_picker_event(LevelPicker *level_picker,
|
|||
trace_assert(level_picker);
|
||||
trace_assert(event);
|
||||
|
||||
{
|
||||
const Rect viewport = camera_view_port_screen(camera);
|
||||
const Rect position = {
|
||||
.w = viewport.w * level_picker->volume_slider_scale.x,
|
||||
.h = viewport.h * level_picker->volume_slider_scale.y,
|
||||
.x = viewport.w - viewport.w * level_picker->volume_slider_scale.x - 5.0f,
|
||||
.y = 5.0f,
|
||||
};
|
||||
int selected = 0;
|
||||
if (slider_event(
|
||||
&level_picker->volume_slider,
|
||||
event,
|
||||
position,
|
||||
&selected) < 0) {
|
||||
return -1;
|
||||
}
|
||||
if(selected){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
switch (event->type) {
|
||||
case SDL_WINDOWEVENT: {
|
||||
switch (event->window.event) {
|
||||
|
@ -263,9 +214,3 @@ int level_picker_enter_camera_event(LevelPicker *level_picker,
|
|||
camera_center_at(camera, level_picker->camera_position);
|
||||
return 0;
|
||||
}
|
||||
|
||||
float level_picker_get_volume(LevelPicker *level_picker)
|
||||
{
|
||||
trace_assert(level_picker);
|
||||
return level_picker->volume_slider.value;
|
||||
}
|
||||
|
|
|
@ -27,6 +27,5 @@ int level_picker_enter_camera_event(LevelPicker *level_picker,
|
|||
const char *level_picker_selected_level(const LevelPicker *level_picker);
|
||||
void level_picker_clean_selection(LevelPicker *level_picker);
|
||||
|
||||
float level_picker_get_volume(LevelPicker *level_picker);
|
||||
|
||||
#endif // LEVEL_PICKER_H_
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
#include "system/stacktrace.h"
|
||||
#include "settings.h"
|
||||
|
||||
Settings create_settings(void)
|
||||
{
|
||||
Settings settings = {
|
||||
.volume_slider = {
|
||||
.drag = 0,
|
||||
.value = 80.0f,
|
||||
.max_value = 100.0f,
|
||||
},
|
||||
|
||||
.volume_slider_scale = {
|
||||
0.25f, 0.10f
|
||||
},
|
||||
|
||||
.background = {
|
||||
.base_color = {0.5f, 0.8f, 0.5f, 1.0f}
|
||||
},
|
||||
|
||||
.camera_position = {
|
||||
0.0f, 0.0f
|
||||
}
|
||||
};
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
void settings_render(const Settings *settings, const Camera *camera)
|
||||
{
|
||||
trace_assert(settings);
|
||||
trace_assert(camera);
|
||||
|
||||
background_render(&settings->background, camera);
|
||||
|
||||
const Rect viewport = camera_view_port_screen(camera);
|
||||
|
||||
/* CSS volume */
|
||||
const Rect position = {
|
||||
.w = viewport.w * settings->volume_slider_scale.x,
|
||||
.h = viewport.h * settings->volume_slider_scale.y,
|
||||
.x = viewport.w - viewport.w * settings->volume_slider_scale.x - 5.0f,
|
||||
.y = 5.0f,
|
||||
};
|
||||
|
||||
/* HTML volume */
|
||||
slider_render(&settings->volume_slider, camera, position);
|
||||
}
|
||||
|
||||
void settings_event(Settings *settings, Camera *camera, const SDL_Event *event)
|
||||
{
|
||||
trace_assert(settings);
|
||||
trace_assert(event);
|
||||
|
||||
const Rect viewport = camera_view_port_screen(camera);
|
||||
const Rect position = {
|
||||
.w = viewport.w * settings->volume_slider_scale.x,
|
||||
.h = viewport.h * settings->volume_slider_scale.y,
|
||||
.x = viewport.w - viewport.w * settings->volume_slider_scale.x - 5.0f,
|
||||
.y = 5.0f,
|
||||
};
|
||||
|
||||
if (slider_event(
|
||||
&settings->volume_slider,
|
||||
event,
|
||||
position, NULL) < 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void settings_update(Settings *settings, Camera *camera, float dt)
|
||||
{
|
||||
trace_assert(settings);
|
||||
trace_assert(camera);
|
||||
|
||||
vec_add(&settings->camera_position,
|
||||
vec(50.0f * dt, 0.0f));
|
||||
camera_center_at(camera, settings->camera_position);
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
#ifndef SETTINGS_H_
|
||||
#define SETTINGS_H_
|
||||
|
||||
#include "game/camera.h"
|
||||
#include "game/level/background.h"
|
||||
#include "ui/slider.h"
|
||||
|
||||
typedef struct {
|
||||
Background background;
|
||||
Slider volume_slider;
|
||||
Vec2f volume_slider_scale;
|
||||
Vec2f camera_position;
|
||||
} Settings;
|
||||
|
||||
Settings create_settings(void);
|
||||
|
||||
void settings_render(const Settings *settings, const Camera *camera);
|
||||
void settings_event(Settings *settings, Camera *camera, const SDL_Event *event);
|
||||
void settings_update(Settings *settings, Camera *camera, float dt);
|
||||
|
||||
#endif // SETTINGS_H_
|
Loading…
Reference in New Issue