From af2244518b05095825e10fc155208e0331a08a36 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 00:01:50 +0700 Subject: [PATCH 01/10] Make platforms a transparent entity --- src/game/level.c | 27 ++++++------------- src/game/level/platforms.c | 51 +++++++++++------------------------ src/game/level/platforms.h | 11 +++++--- src/game/level/rigid_bodies.h | 2 +- 4 files changed, 33 insertions(+), 58 deletions(-) diff --git a/src/game/level.c b/src/game/level.c index eeb5b654..433b8a50 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -41,10 +41,10 @@ struct Level Background background; RigidBodies *rigid_bodies; Player *player; - Platforms *platforms; + Platforms platforms; Goals *goals; Lava *lava; - Platforms *back_platforms; + Platforms back_platforms; Boxes *boxes; Labels *labels; Regions *regions; @@ -84,13 +84,7 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor) RETURN_LT(lt, NULL); } - level->platforms = PUSH_LT( - lt, - create_platforms_from_rect_layer(level_editor->platforms_layer), - destroy_platforms); - if (level->platforms == NULL) { - RETURN_LT(lt, NULL); - } + level->platforms = create_platforms_from_rect_layer(level_editor->platforms_layer); level->goals = PUSH_LT( lt, @@ -108,13 +102,8 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor) RETURN_LT(lt, NULL); } - level->back_platforms = PUSH_LT( - lt, - create_platforms_from_rect_layer(level_editor->back_platforms_layer), - destroy_platforms); - if (level->back_platforms == NULL) { - RETURN_LT(lt, NULL); - } + level->back_platforms = + create_platforms_from_rect_layer(level_editor->back_platforms_layer); level->boxes = PUSH_LT( lt, @@ -160,7 +149,7 @@ int level_render(const Level *level, const Camera *camera) return -1; } - if (platforms_render(level->back_platforms, camera) < 0) { + if (platforms_render(&level->back_platforms, camera) < 0) { return -1; } @@ -176,7 +165,7 @@ int level_render(const Level *level, const Camera *camera) return -1; } - if (platforms_render(level->platforms, camera) < 0) { + if (platforms_render(&level->platforms, camera) < 0) { return -1; } @@ -210,7 +199,7 @@ int level_update(Level *level, float delta_time) boxes_update(level->boxes, delta_time); player_update(level->player, delta_time); - rigid_bodies_collide(level->rigid_bodies, level->platforms); + rigid_bodies_collide(level->rigid_bodies, &level->platforms); player_die_from_lava(level->player, level->lava); regions_player_enter(level->regions, level->player); diff --git a/src/game/level/platforms.c b/src/game/level/platforms.c index 67b552ff..460e77d7 100644 --- a/src/game/level/platforms.c +++ b/src/game/level/platforms.c @@ -12,51 +12,32 @@ #include "game/level/level_editor/rect_layer.h" #include "math/extrema.h" -struct Platforms { - Lt *lt; - - Rect *rects; - Color *colors; - size_t rects_size; -}; - -Platforms *create_platforms_from_rect_layer(const RectLayer *layer) +Platforms create_platforms_from_rect_layer(const RectLayer *layer) { trace_assert(layer); - Lt *lt = create_lt(); + Platforms platforms = {0}; + platforms.rects_size = rect_layer_count(layer); - Platforms *platforms = PUSH_LT( - lt, - nth_calloc(1, sizeof(Platforms)), - free); - if (platforms == NULL) { - RETURN_LT(lt, NULL); - } - platforms->lt = lt; + platforms.rects = nth_calloc(1, sizeof(Rect) * platforms.rects_size); + memcpy( + platforms.rects, + rect_layer_rects(layer), + sizeof(Rect) * platforms.rects_size); - platforms->rects_size = rect_layer_count(layer); - - platforms->rects = PUSH_LT(lt, nth_calloc(1, sizeof(Rect) * platforms->rects_size), free); - if (platforms->rects == NULL) { - RETURN_LT(lt, NULL); - } - memcpy(platforms->rects, rect_layer_rects(layer), sizeof(Rect) * platforms->rects_size); - - - platforms->colors = PUSH_LT(lt, nth_calloc(1, sizeof(Color) * platforms->rects_size), free); - if (platforms->colors == NULL) { - RETURN_LT(lt, NULL); - } - memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size); + platforms.colors = nth_calloc(1, sizeof(Color) * platforms.rects_size); + memcpy( + platforms.colors, + rect_layer_colors(layer), + sizeof(Color) * platforms.rects_size); return platforms; } -void destroy_platforms(Platforms *platforms) +void destroy_platforms(Platforms platforms) { - trace_assert(platforms); - RETURN_LT0(platforms->lt); + free(platforms.rects); + free(platforms.colors); } int platforms_render(const Platforms *platforms, diff --git a/src/game/level/platforms.h b/src/game/level/platforms.h index a3c8cb57..112e98ee 100644 --- a/src/game/level/platforms.h +++ b/src/game/level/platforms.h @@ -6,11 +6,16 @@ #include "game/camera.h" #include "math/rect.h" -typedef struct Platforms Platforms; typedef struct RectLayer RectLayer; -Platforms *create_platforms_from_rect_layer(const RectLayer *layer); -void destroy_platforms(Platforms *platforms); +typedef struct { + Rect *rects; + Color *colors; + size_t rects_size; +} Platforms; + +Platforms create_platforms_from_rect_layer(const RectLayer *layer); +void destroy_platforms(Platforms platforms); int platforms_render(const Platforms *platforms, const Camera *camera); diff --git a/src/game/level/rigid_bodies.h b/src/game/level/rigid_bodies.h index 8d18bea8..3f03d2d1 100644 --- a/src/game/level/rigid_bodies.h +++ b/src/game/level/rigid_bodies.h @@ -2,9 +2,9 @@ #define RIGID_BODIES_H_ #include "math/mat3x3.h" +#include "game/level/platforms.h" typedef struct RigidBodies RigidBodies; -typedef struct Platforms Platforms; typedef size_t RigidBodyId; From 40004db6af8ea81a6e494a0f7e8d8ac7a7ad1629 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 00:05:49 +0700 Subject: [PATCH 02/10] Revert "Make platforms a transparent entity" This reverts commit af2244518b05095825e10fc155208e0331a08a36. It's not really needed to achive what I'm trying to achive --- src/game/level.c | 27 +++++++++++++------ src/game/level/platforms.c | 51 ++++++++++++++++++++++++----------- src/game/level/platforms.h | 11 +++----- src/game/level/rigid_bodies.h | 2 +- 4 files changed, 58 insertions(+), 33 deletions(-) diff --git a/src/game/level.c b/src/game/level.c index 433b8a50..eeb5b654 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -41,10 +41,10 @@ struct Level Background background; RigidBodies *rigid_bodies; Player *player; - Platforms platforms; + Platforms *platforms; Goals *goals; Lava *lava; - Platforms back_platforms; + Platforms *back_platforms; Boxes *boxes; Labels *labels; Regions *regions; @@ -84,7 +84,13 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor) RETURN_LT(lt, NULL); } - level->platforms = create_platforms_from_rect_layer(level_editor->platforms_layer); + level->platforms = PUSH_LT( + lt, + create_platforms_from_rect_layer(level_editor->platforms_layer), + destroy_platforms); + if (level->platforms == NULL) { + RETURN_LT(lt, NULL); + } level->goals = PUSH_LT( lt, @@ -102,8 +108,13 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor) RETURN_LT(lt, NULL); } - level->back_platforms = - create_platforms_from_rect_layer(level_editor->back_platforms_layer); + level->back_platforms = PUSH_LT( + lt, + create_platforms_from_rect_layer(level_editor->back_platforms_layer), + destroy_platforms); + if (level->back_platforms == NULL) { + RETURN_LT(lt, NULL); + } level->boxes = PUSH_LT( lt, @@ -149,7 +160,7 @@ int level_render(const Level *level, const Camera *camera) return -1; } - if (platforms_render(&level->back_platforms, camera) < 0) { + if (platforms_render(level->back_platforms, camera) < 0) { return -1; } @@ -165,7 +176,7 @@ int level_render(const Level *level, const Camera *camera) return -1; } - if (platforms_render(&level->platforms, camera) < 0) { + if (platforms_render(level->platforms, camera) < 0) { return -1; } @@ -199,7 +210,7 @@ int level_update(Level *level, float delta_time) boxes_update(level->boxes, delta_time); player_update(level->player, delta_time); - rigid_bodies_collide(level->rigid_bodies, &level->platforms); + rigid_bodies_collide(level->rigid_bodies, level->platforms); player_die_from_lava(level->player, level->lava); regions_player_enter(level->regions, level->player); diff --git a/src/game/level/platforms.c b/src/game/level/platforms.c index 460e77d7..67b552ff 100644 --- a/src/game/level/platforms.c +++ b/src/game/level/platforms.c @@ -12,32 +12,51 @@ #include "game/level/level_editor/rect_layer.h" #include "math/extrema.h" -Platforms create_platforms_from_rect_layer(const RectLayer *layer) +struct Platforms { + Lt *lt; + + Rect *rects; + Color *colors; + size_t rects_size; +}; + +Platforms *create_platforms_from_rect_layer(const RectLayer *layer) { trace_assert(layer); - Platforms platforms = {0}; - platforms.rects_size = rect_layer_count(layer); + Lt *lt = create_lt(); - platforms.rects = nth_calloc(1, sizeof(Rect) * platforms.rects_size); - memcpy( - platforms.rects, - rect_layer_rects(layer), - sizeof(Rect) * platforms.rects_size); + Platforms *platforms = PUSH_LT( + lt, + nth_calloc(1, sizeof(Platforms)), + free); + if (platforms == NULL) { + RETURN_LT(lt, NULL); + } + platforms->lt = lt; - platforms.colors = nth_calloc(1, sizeof(Color) * platforms.rects_size); - memcpy( - platforms.colors, - rect_layer_colors(layer), - sizeof(Color) * platforms.rects_size); + platforms->rects_size = rect_layer_count(layer); + + platforms->rects = PUSH_LT(lt, nth_calloc(1, sizeof(Rect) * platforms->rects_size), free); + if (platforms->rects == NULL) { + RETURN_LT(lt, NULL); + } + memcpy(platforms->rects, rect_layer_rects(layer), sizeof(Rect) * platforms->rects_size); + + + platforms->colors = PUSH_LT(lt, nth_calloc(1, sizeof(Color) * platforms->rects_size), free); + if (platforms->colors == NULL) { + RETURN_LT(lt, NULL); + } + memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size); return platforms; } -void destroy_platforms(Platforms platforms) +void destroy_platforms(Platforms *platforms) { - free(platforms.rects); - free(platforms.colors); + trace_assert(platforms); + RETURN_LT0(platforms->lt); } int platforms_render(const Platforms *platforms, diff --git a/src/game/level/platforms.h b/src/game/level/platforms.h index 112e98ee..a3c8cb57 100644 --- a/src/game/level/platforms.h +++ b/src/game/level/platforms.h @@ -6,16 +6,11 @@ #include "game/camera.h" #include "math/rect.h" +typedef struct Platforms Platforms; typedef struct RectLayer RectLayer; -typedef struct { - Rect *rects; - Color *colors; - size_t rects_size; -} Platforms; - -Platforms create_platforms_from_rect_layer(const RectLayer *layer); -void destroy_platforms(Platforms platforms); +Platforms *create_platforms_from_rect_layer(const RectLayer *layer); +void destroy_platforms(Platforms *platforms); int platforms_render(const Platforms *platforms, const Camera *camera); diff --git a/src/game/level/rigid_bodies.h b/src/game/level/rigid_bodies.h index 3f03d2d1..8d18bea8 100644 --- a/src/game/level/rigid_bodies.h +++ b/src/game/level/rigid_bodies.h @@ -2,9 +2,9 @@ #define RIGID_BODIES_H_ #include "math/mat3x3.h" -#include "game/level/platforms.h" typedef struct RigidBodies RigidBodies; +typedef struct Platforms Platforms; typedef size_t RigidBodyId; From 5cb28cec4a7a2961b47f3f092f831ef6ba0bbfec Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 01:26:34 +0700 Subject: [PATCH 03/10] Make back platforms always hide when player touches them --- src/game/level.c | 4 ++++ src/game/level/platforms.c | 36 ++++++++++++++++++++++++++++++++++++ src/game/level/platforms.h | 5 +++++ 3 files changed, 45 insertions(+) diff --git a/src/game/level.c b/src/game/level.c index eeb5b654..c7c95c82 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -220,6 +220,10 @@ int level_update(Level *level, float delta_time) lava_update(level->lava, delta_time); labels_update(level->labels, delta_time); + Rect hitbox = player_hitbox(level->player); + platforms_hide_platform_at(level->back_platforms, vec(hitbox.x, hitbox.y)); + platforms_update(level->back_platforms, delta_time); + return 0; } diff --git a/src/game/level/platforms.c b/src/game/level/platforms.c index 67b552ff..08acf507 100644 --- a/src/game/level/platforms.c +++ b/src/game/level/platforms.c @@ -17,6 +17,7 @@ struct Platforms { Rect *rects; Color *colors; + int *hiding; size_t rects_size; }; @@ -50,6 +51,12 @@ Platforms *create_platforms_from_rect_layer(const RectLayer *layer) } memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size); + platforms->hiding = PUSH_LT(lt, nth_calloc(1, sizeof(int) * platforms->rects_size), free); + if (platforms->hiding == NULL) { + RETURN_LT(lt, NULL); + } + memset(platforms->hiding, 0, sizeof(int) * platforms->rects_size); + return platforms; } @@ -141,3 +148,32 @@ Vec2f platforms_snap_rect(const Platforms *platforms, return result; } + +#define HIDING_SPEED 2.0f + +void platforms_update(Platforms *platforms, float dt) +{ + trace_assert(platforms); + for (size_t i = 0; i < platforms->rects_size; ++i) { + if (platforms->hiding[i]) { + if (platforms->colors[i].a > 0.0f) { + platforms->colors[i].a = + fmaxf(0.0f, platforms->colors[i].a - HIDING_SPEED * dt); + } else { + platforms->hiding[i] = 0; + } + } + } +} + +void platforms_hide_platform_at(const Platforms *platforms, + Vec2f position) +{ + trace_assert(platforms); + + for (size_t i = 0; i < platforms->rects_size; ++i) { + if (rect_contains_point(platforms->rects[i], position)) { + platforms->hiding[i] = 1; + } + } +} diff --git a/src/game/level/platforms.h b/src/game/level/platforms.h index a3c8cb57..35e84fea 100644 --- a/src/game/level/platforms.h +++ b/src/game/level/platforms.h @@ -15,10 +15,15 @@ void destroy_platforms(Platforms *platforms); int platforms_render(const Platforms *platforms, const Camera *camera); +void platforms_update(Platforms *platforms, float dt); + void platforms_touches_rect_sides(const Platforms *platforms, Rect object, int sides[RECT_SIDE_N]); Vec2f platforms_snap_rect(const Platforms *platforms, Rect *object); +void platforms_hide_platform_at(const Platforms *platforms, + Vec2f position); + #endif // PLATFORMS_H_ From 100d4dbc07e806f3d065e782040ef65f91b84b27 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 02:50:56 +0700 Subject: [PATCH 04/10] Introduce Phantom Platforms --- assets/levels/level-02.txt | 4 ++ nothing.c | 1 + src/game/level/level_editor.c | 5 +- src/game/level/level_editor.h | 1 + src/game/level/level_editor/layer_picker.c | 2 + src/game/level/level_editor/layer_picker.h | 1 + src/game/level/phantom_platforms.c | 63 ++++++++++++++++++++++ src/game/level/phantom_platforms.h | 18 +++++++ 8 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/game/level/phantom_platforms.c create mode 100644 src/game/level/phantom_platforms.h diff --git a/assets/levels/level-02.txt b/assets/levels/level-02.txt index 6ef6ac53..449c114f 100644 --- a/assets/levels/level-02.txt +++ b/assets/levels/level-02.txt @@ -42,3 +42,7 @@ box_1 -609.278137 -667.919678 112.500031 107.291695 9aa034 box_0 -3923.780518 452.429810 112.500031 107.291695 a05034 0 0 +3 +pp_0 -104.841812 -42.929047 55.225319 53.499516 ff0000 +pp_1 30.632792 -131.375824 56.951111 62.559914 ff0000 +pp_2 59.539791 -29.554169 44.870571 75.071899 ff0000 diff --git a/nothing.c b/nothing.c index ef13b378..7c45c8a3 100644 --- a/nothing.c +++ b/nothing.c @@ -49,3 +49,4 @@ #include "src/dynarray.c" #include "src/system/file.c" #include "src/ring_buffer.c" +#include "src/game/level/phantom_platforms.h" diff --git a/src/game/level/level_editor.c b/src/game/level/level_editor.c index 24c44f1e..498f56ca 100644 --- a/src/game/level/level_editor.c +++ b/src/game/level/level_editor.c @@ -50,6 +50,7 @@ LevelEditor *create_level_editor(Memory *memory, Cursor *cursor) level_editor->regions_layer = create_rect_layer(memory, "region", cursor); level_editor->goals_layer = create_point_layer(memory, "goal"); level_editor->label_layer = create_label_layer(memory, "label"); + level_editor->pp_layer = create_rect_layer(memory, "pp", cursor); level_editor->layers[LAYER_PICKER_BOXES] = rect_layer_as_layer(level_editor->boxes_layer); level_editor->layers[LAYER_PICKER_PLATFORMS] = rect_layer_as_layer(level_editor->platforms_layer); @@ -60,6 +61,7 @@ LevelEditor *create_level_editor(Memory *memory, Cursor *cursor) level_editor->layers[LAYER_PICKER_REGIONS] = rect_layer_as_layer(level_editor->regions_layer); level_editor->layers[LAYER_PICKER_BACKGROUND] = background_layer_as_layer(&level_editor->background_layer); level_editor->layers[LAYER_PICKER_LABELS] = label_layer_as_layer(level_editor->label_layer); + level_editor->layers[LAYER_PICKER_PP] = rect_layer_as_layer(level_editor->pp_layer); level_editor->notice = (FadingWigglyText) { @@ -363,7 +365,8 @@ static LayerPicker level_format_layer_order[LAYER_PICKER_N] = { LAYER_PICKER_BACK_PLATFORMS, LAYER_PICKER_BOXES, LAYER_PICKER_LABELS, - LAYER_PICKER_REGIONS + LAYER_PICKER_REGIONS, + LAYER_PICKER_PP }; /* TODO(#904): LevelEditor does not check that the saved level file is modified by external program */ diff --git a/src/game/level/level_editor.h b/src/game/level/level_editor.h index afa2494d..4e5bd674 100644 --- a/src/game/level/level_editor.h +++ b/src/game/level/level_editor.h @@ -36,6 +36,7 @@ struct LevelEditor RectLayer *regions_layer; BackgroundLayer background_layer; LabelLayer *label_layer; + RectLayer *pp_layer; LayerPtr layers[LAYER_PICKER_N]; diff --git a/src/game/level/level_editor/layer_picker.c b/src/game/level/level_editor/layer_picker.c index 077a56b3..80287daa 100644 --- a/src/game/level/level_editor/layer_picker.c +++ b/src/game/level/level_editor/layer_picker.c @@ -25,6 +25,7 @@ static const Color LAYER_CELL_BACKGROUND_COLORS[LAYER_PICKER_N] = { {0.2f, 1.0f, 0.6f, 1.0f}, // LAYER_PICKER_BOXES {0.2f, 0.6f, 1.0f, 1.0f}, // LAYER_PICKER_LABELS {0.2f, 1.0f, 0.6f, 1.0f}, // LAYER_PICKER_REGIONS + {0.2f, 1.0f, 0.6f, 1.0f}, // LAYER_PICKER_PP }; static const char *LAYER_CELL_TITLES[LAYER_PICKER_N] = { @@ -37,6 +38,7 @@ static const char *LAYER_CELL_TITLES[LAYER_PICKER_N] = { "Boxes", // LAYER_PICKER_BOXES "Labels", // LAYER_PICKER_LABELS "Regions", // LAYER_PICKER_REGIONS + "Phantom Platforms", // LAYER_PICKER_PP }; inline static float layer_picker_max_width(void) diff --git a/src/game/level/level_editor/layer_picker.h b/src/game/level/level_editor/layer_picker.h index 074dd146..87da49a5 100644 --- a/src/game/level/level_editor/layer_picker.h +++ b/src/game/level/level_editor/layer_picker.h @@ -15,6 +15,7 @@ typedef enum { LAYER_PICKER_BOXES, LAYER_PICKER_LABELS, LAYER_PICKER_REGIONS, + LAYER_PICKER_PP, LAYER_PICKER_N } LayerPicker; diff --git a/src/game/level/phantom_platforms.c b/src/game/level/phantom_platforms.c new file mode 100644 index 00000000..6ed96ddc --- /dev/null +++ b/src/game/level/phantom_platforms.c @@ -0,0 +1,63 @@ +#include "phantom_platforms.h" + +Phantom_Platforms create_phantom_platforms(RectLayer *rect_layer) +{ + Phantom_Platforms pp; + + pp.size = rect_layer->rects.count; + pp.rects = malloc(sizeof(pp.rects[0]) * pp.size); + memcpy(pp.rects, rect_layer->rects.data, sizeof(pp.rects[0]) * pp.size); + + pp.colors = malloc(sizeof(pp.colors[0]) * pp.size); + memcpy(pp.colors, rect_layer->colors.data, sizeof(pp.colors[0]) * pp.size); + + pp.hiding = calloc(1, sizeof(pp.hiding[0]) * pp.size); + + return pp; +} + +void destroy_phantom_platforms(Phantom_Platforms pp) +{ + free(pp.rects); + free(pp.colors); + free(pp.hiding); +} + +void phantom_platforms_render(Phantom_Platforms *pp, Camera *camera) +{ + trace_assert(pp); + trace_assert(camera); + + for (size_t i = 0; i < pp->size; ++i) { + camera_fill_rect(camera, pp->rects[i], pp->colors[i]); + } +} + +#define HIDING_SPEED 2.0f + +void phantom_platforms_update(Phantom_Platforms *pp, float dt) +{ + trace_assert(pp); + + for (size_t i = 0; i < pp->size; ++i) { + if (pp->hiding[i]) { + if (pp->colors[i].a > 0.0f) { + pp->colors[i].a = + fmaxf(0.0f, pp->colors[i].a - HIDING_SPEED * dt); + } else { + pp->hiding[i] = 0; + } + } + } +} + +void phantom_platforms_hide_at(Phantom_Platforms *pp, Vec2f position) +{ + trace_assert(pp); + + for (size_t i = 0; i < pp->size; ++i) { + if (rect_contains_point(pp->rects[i], position)) { + pp->hiding[i] = 1; + } + } +} diff --git a/src/game/level/phantom_platforms.h b/src/game/level/phantom_platforms.h new file mode 100644 index 00000000..710bc494 --- /dev/null +++ b/src/game/level/phantom_platforms.h @@ -0,0 +1,18 @@ +#ifndef PHANTOM_PLATFORMS_H_ +#define PHANTOM_PLATFORMS_H_ + +typedef struct { + size_t size; + Rect *rects; + Color *colors; + int *hiding; +} Phantom_Platforms; + +Phantom_Platforms create_phantom_platforms(RectLayer *rect_layer); +void destroy_phantom_platforms(Phantom_Platforms pp); + +void phantom_platforms_render(Phantom_Platforms *pp, Camera *camera); +void phantom_platforms_update(Phantom_Platforms *pp, float dt); +void phantom_platforms_hide_at(Phantom_Platforms *pp, Vec2f position); + +#endif // PHANTOM_PLATFORMS_H_ From 4c093ee248e6fb7f1e14cc4cac6930c41a02506c Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 03:04:51 +0700 Subject: [PATCH 05/10] Wire up pp to level loop --- assets/levels/level-02.txt | 6 +++--- nothing.c | 2 +- src/game/level.c | 11 +++++++++-- src/game/level/level_editor.c | 1 + src/game/level/phantom_platforms.c | 4 ++-- src/game/level/phantom_platforms.h | 2 +- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/assets/levels/level-02.txt b/assets/levels/level-02.txt index 449c114f..d8fe8287 100644 --- a/assets/levels/level-02.txt +++ b/assets/levels/level-02.txt @@ -43,6 +43,6 @@ box_0 -3923.780518 452.429810 112.500031 107.291695 a05034 0 0 3 -pp_0 -104.841812 -42.929047 55.225319 53.499516 ff0000 -pp_1 30.632792 -131.375824 56.951111 62.559914 ff0000 -pp_2 59.539791 -29.554169 44.870571 75.071899 ff0000 +pp_0 -116.490898 -97.722908 42.713326 84.995201 ff0000 +pp_1 92.761269 -140.436234 31.927139 80.249283 ff0000 +pp_2 30.632792 -16.610737 41.418991 59.971233 ff0000 diff --git a/nothing.c b/nothing.c index 7c45c8a3..ea454258 100644 --- a/nothing.c +++ b/nothing.c @@ -49,4 +49,4 @@ #include "src/dynarray.c" #include "src/system/file.c" #include "src/ring_buffer.c" -#include "src/game/level/phantom_platforms.h" +#include "src/game/level/phantom_platforms.c" diff --git a/src/game/level.c b/src/game/level.c index c7c95c82..bb9f7ba9 100644 --- a/src/game/level.c +++ b/src/game/level.c @@ -10,6 +10,7 @@ #include "game/level/labels.h" #include "game/level/lava.h" #include "game/level/platforms.h" +#include "game/level/phantom_platforms.h" #include "game/level/player.h" #include "game/level/regions.h" #include "game/level/rigid_bodies.h" @@ -48,6 +49,7 @@ struct Level Boxes *boxes; Labels *labels; Regions *regions; + Phantom_Platforms pp; }; Level *create_level_from_level_editor(const LevelEditor *level_editor) @@ -143,12 +145,15 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor) RETURN_LT(lt, NULL); } + level->pp = create_phantom_platforms(level_editor->pp_layer); + return level; } void destroy_level(Level *level) { trace_assert(level); + destroy_phantom_platforms(level->pp); RETURN_LT0(level->lt); } @@ -164,6 +169,8 @@ int level_render(const Level *level, const Camera *camera) return -1; } + phantom_platforms_render(&level->pp, camera); + if (player_render(level->player, camera) < 0) { return -1; } @@ -221,8 +228,8 @@ int level_update(Level *level, float delta_time) labels_update(level->labels, delta_time); Rect hitbox = player_hitbox(level->player); - platforms_hide_platform_at(level->back_platforms, vec(hitbox.x, hitbox.y)); - platforms_update(level->back_platforms, delta_time); + phantom_platforms_hide_at(&level->pp, vec(hitbox.x, hitbox.y)); + phantom_platforms_update(&level->pp, delta_time); return 0; } diff --git a/src/game/level/level_editor.c b/src/game/level/level_editor.c index 498f56ca..571aed64 100644 --- a/src/game/level/level_editor.c +++ b/src/game/level/level_editor.c @@ -113,6 +113,7 @@ LevelEditor *create_level_editor_from_file(Memory *memory, Cursor *cursor, const rect_layer_load(level_editor->boxes_layer, memory, &input); label_layer_load(level_editor->label_layer, memory, &input); rect_layer_load(level_editor->regions_layer, memory, &input); + rect_layer_load(level_editor->pp_layer, memory, &input); undo_history_clean(level_editor->undo_history); return level_editor; diff --git a/src/game/level/phantom_platforms.c b/src/game/level/phantom_platforms.c index 6ed96ddc..0e3d9d9c 100644 --- a/src/game/level/phantom_platforms.c +++ b/src/game/level/phantom_platforms.c @@ -23,7 +23,7 @@ void destroy_phantom_platforms(Phantom_Platforms pp) free(pp.hiding); } -void phantom_platforms_render(Phantom_Platforms *pp, Camera *camera) +void phantom_platforms_render(const Phantom_Platforms *pp, const Camera *camera) { trace_assert(pp); trace_assert(camera); @@ -33,7 +33,7 @@ void phantom_platforms_render(Phantom_Platforms *pp, Camera *camera) } } -#define HIDING_SPEED 2.0f +#define HIDING_SPEED 4.0f void phantom_platforms_update(Phantom_Platforms *pp, float dt) { diff --git a/src/game/level/phantom_platforms.h b/src/game/level/phantom_platforms.h index 710bc494..4b46d920 100644 --- a/src/game/level/phantom_platforms.h +++ b/src/game/level/phantom_platforms.h @@ -11,7 +11,7 @@ typedef struct { Phantom_Platforms create_phantom_platforms(RectLayer *rect_layer); void destroy_phantom_platforms(Phantom_Platforms pp); -void phantom_platforms_render(Phantom_Platforms *pp, Camera *camera); +void phantom_platforms_render(const Phantom_Platforms *pp, const Camera *camera); void phantom_platforms_update(Phantom_Platforms *pp, float dt); void phantom_platforms_hide_at(Phantom_Platforms *pp, Vec2f position); From e838714ef9f8b68a980e5dd77d27a1045d7d4b41 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 03:08:56 +0700 Subject: [PATCH 06/10] Remove dead code from platforms --- src/game/level/platforms.c | 36 ------------------------------------ src/game/level/platforms.h | 5 ----- 2 files changed, 41 deletions(-) diff --git a/src/game/level/platforms.c b/src/game/level/platforms.c index 08acf507..67b552ff 100644 --- a/src/game/level/platforms.c +++ b/src/game/level/platforms.c @@ -17,7 +17,6 @@ struct Platforms { Rect *rects; Color *colors; - int *hiding; size_t rects_size; }; @@ -51,12 +50,6 @@ Platforms *create_platforms_from_rect_layer(const RectLayer *layer) } memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size); - platforms->hiding = PUSH_LT(lt, nth_calloc(1, sizeof(int) * platforms->rects_size), free); - if (platforms->hiding == NULL) { - RETURN_LT(lt, NULL); - } - memset(platforms->hiding, 0, sizeof(int) * platforms->rects_size); - return platforms; } @@ -148,32 +141,3 @@ Vec2f platforms_snap_rect(const Platforms *platforms, return result; } - -#define HIDING_SPEED 2.0f - -void platforms_update(Platforms *platforms, float dt) -{ - trace_assert(platforms); - for (size_t i = 0; i < platforms->rects_size; ++i) { - if (platforms->hiding[i]) { - if (platforms->colors[i].a > 0.0f) { - platforms->colors[i].a = - fmaxf(0.0f, platforms->colors[i].a - HIDING_SPEED * dt); - } else { - platforms->hiding[i] = 0; - } - } - } -} - -void platforms_hide_platform_at(const Platforms *platforms, - Vec2f position) -{ - trace_assert(platforms); - - for (size_t i = 0; i < platforms->rects_size; ++i) { - if (rect_contains_point(platforms->rects[i], position)) { - platforms->hiding[i] = 1; - } - } -} diff --git a/src/game/level/platforms.h b/src/game/level/platforms.h index 35e84fea..a3c8cb57 100644 --- a/src/game/level/platforms.h +++ b/src/game/level/platforms.h @@ -15,15 +15,10 @@ void destroy_platforms(Platforms *platforms); int platforms_render(const Platforms *platforms, const Camera *camera); -void platforms_update(Platforms *platforms, float dt); - void platforms_touches_rect_sides(const Platforms *platforms, Rect object, int sides[RECT_SIDE_N]); Vec2f platforms_snap_rect(const Platforms *platforms, Rect *object); -void platforms_hide_platform_at(const Platforms *platforms, - Vec2f position); - #endif // PLATFORMS_H_ From 475c7fe7efe29681b15248dbdef99f86581a8855 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 03:09:06 +0700 Subject: [PATCH 07/10] [Level 02] Turn back platforms into phantom platforms --- assets/levels/level-02.txt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/assets/levels/level-02.txt b/assets/levels/level-02.txt index d8fe8287..1b0aa6b5 100644 --- a/assets/levels/level-02.txt +++ b/assets/levels/level-02.txt @@ -18,10 +18,7 @@ platform_0 -1307.807495 -5332.081543 519.166626 4358.668457 80926d 2 lava_0 182.002197 589.132202 4415.973633 688.541870 d42b2b lava_0 -8050.391602 730.803101 4415.973633 688.541870 d42b2b -3 -back_platform_0 -185.010040 442.315765 519.166626 221.875031 80926d -back_platform_0 1640.383789 420.668457 519.166626 221.875031 80926d -back_platform_0 -1307.840332 -1029.460205 519.166626 221.875031 80926d +0 17 box_0 120.543991 -72.326294 112.500031 107.291695 9aa034 box_1 714.640747 516.840698 112.500031 107.291695 9aa034 @@ -43,6 +40,6 @@ box_0 -3923.780518 452.429810 112.500031 107.291695 a05034 0 0 3 -pp_0 -116.490898 -97.722908 42.713326 84.995201 ff0000 -pp_1 92.761269 -140.436234 31.927139 80.249283 ff0000 -pp_2 30.632792 -16.610737 41.418991 59.971233 ff0000 +back_platform_0 -185.010040 442.315765 519.166626 221.875031 80926d +back_platform_0 1640.383789 420.668457 519.166626 221.875031 80926d +back_platform_0 -1307.840332 -1029.460205 519.166626 221.875031 80926d From 2e2a5d7c2c4ca159e8eebc294509975cb9c79c1a Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 03:13:42 +0700 Subject: [PATCH 08/10] Add TODO(#1247) --- src/game/level/phantom_platforms.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/game/level/phantom_platforms.c b/src/game/level/phantom_platforms.c index 0e3d9d9c..877349f7 100644 --- a/src/game/level/phantom_platforms.c +++ b/src/game/level/phantom_platforms.c @@ -35,6 +35,7 @@ void phantom_platforms_render(const Phantom_Platforms *pp, const Camera *camera) #define HIDING_SPEED 4.0f +// TODO(#1247): phantom_platforms_update is O(N) even when nothing is animated void phantom_platforms_update(Phantom_Platforms *pp, float dt) { trace_assert(pp); @@ -51,6 +52,7 @@ void phantom_platforms_update(Phantom_Platforms *pp, float dt) } } +// TODO: phantom_platforms_hide_at is O(N) void phantom_platforms_hide_at(Phantom_Platforms *pp, Vec2f position) { trace_assert(pp); From 3a667bb8b6fc9581f447bda3fa5b12fb01b8ef36 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 03:13:43 +0700 Subject: [PATCH 09/10] Add TODO(#1248) --- src/game/level/phantom_platforms.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/level/phantom_platforms.c b/src/game/level/phantom_platforms.c index 877349f7..bf45c31b 100644 --- a/src/game/level/phantom_platforms.c +++ b/src/game/level/phantom_platforms.c @@ -52,7 +52,7 @@ void phantom_platforms_update(Phantom_Platforms *pp, float dt) } } -// TODO: phantom_platforms_hide_at is O(N) +// TODO(#1248): phantom_platforms_hide_at is O(N) void phantom_platforms_hide_at(Phantom_Platforms *pp, Vec2f position) { trace_assert(pp); From f7715d082fff6f14fdf401ff87cdf5487294c231 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 26 Jan 2020 03:17:01 +0700 Subject: [PATCH 10/10] Try to fix cmake build --- CMakeLists.txt | 2 ++ src/game/level/phantom_platforms.h | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38ff578a..44b06126 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,8 @@ add_executable(nothing src/game/level/lava/wavy_rect.c src/game/level/platforms.h src/game/level/platforms.c + src/game/level/phantom_platforms.h + src/game/level/phantom_platforms.c src/game/level/player.h src/game/level/player.c src/game/level/explosion.h diff --git a/src/game/level/phantom_platforms.h b/src/game/level/phantom_platforms.h index 4b46d920..3a5557ea 100644 --- a/src/game/level/phantom_platforms.h +++ b/src/game/level/phantom_platforms.h @@ -1,6 +1,11 @@ #ifndef PHANTOM_PLATFORMS_H_ #define PHANTOM_PLATFORMS_H_ +#include +#include "math/rect.h" +#include "color.h" +#include "game/level/level_editor/rect_layer.h" + typedef struct { size_t size; Rect *rects;