Merge pull request #1117 from tsoding/1071

(#1071) Settings page
master
Alexey Kutepov 2019-11-03 05:05:32 +07:00 committed by GitHub
commit c6d0abddeb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 166 additions and 145 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

79
src/game/settings.c Normal file
View File

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

21
src/game/settings.h Normal file
View File

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