]> git.lizzy.rs Git - nothing.git/commitdiff
Make it possible to switch between platforms and back_platforms
authorrexim <reximkut@gmail.com>
Sun, 26 Jan 2020 19:34:42 +0000 (02:34 +0700)
committerrexim <reximkut@gmail.com>
Sat, 8 Feb 2020 16:51:01 +0000 (23:51 +0700)
assets/levels/urmoma.txt [new file with mode: 0644]
src/game/camera.c
src/game/camera.h
src/game/level.c
src/game/level/background.c

diff --git a/assets/levels/urmoma.txt b/assets/levels/urmoma.txt
new file mode 100644 (file)
index 0000000..d795a3c
--- /dev/null
@@ -0,0 +1,17 @@
+2
+cecd84
+0.000000 0.000000 000000
+2
+platform_0 -100.095917 51.126568 374.496674 33.652920 3f7f3f
+platform_0 -264.333679 -171.212845 277.420898 27.181252 4d824e
+0
+0
+4
+back_platform_1 -84.563766 -332.861908 355.651672 95.349945 db8585
+back_platform_0 -69.463104 -80.896439 194.582947 415.823181 d07878
+back_platform_0 -144.247375 -255.201324 93.767990 488.737854 d16767
+back_platform_1 112.895462 -272.890686 260.877014 590.271851 e08a8a
+0
+0
+0
+0
index edd08cae80a40f1a2a312e8107de6916bb1a1c72..b867a169d0cceb6b837c6885e3a4c1de4af3c7f9 100644 (file)
 static Triangle camera_triangle(const Camera *camera,
                                 const Triangle t);
 
-static SDL_Color camera_sdl_color(const Camera *camera, Color color)
+static Color camera_color(const Camera *camera, Color color)
 {
-    return color_for_sdl(camera->blackwhite_mode ? color_desaturate(color) : color);
+    if (camera->blackwhite_mode) {
+        color = color_desaturate(color);
+    }
+
+    if (camera->transparent_mode) {
+        color.a *= 0.60f;
+    }
+
+    return color;
 }
 
 Camera create_camera(SDL_Renderer *renderer,
@@ -42,7 +50,7 @@ int camera_fill_rect(const Camera *camera,
     const SDL_Rect sdl_rect = rect_for_sdl(
         camera_rect(camera, rect));
 
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (camera->debug_mode) {
         if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a / 2) < 0) {
@@ -73,7 +81,7 @@ int camera_draw_rect(const Camera *camera,
     const SDL_Rect sdl_rect = rect_for_sdl(
         camera_rect(camera, rect));
 
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
         log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
@@ -95,7 +103,7 @@ int camera_draw_rect_screen(const Camera *camera,
     trace_assert(camera);
 
     const SDL_Rect sdl_rect = rect_for_sdl(rect);
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
         log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
@@ -116,7 +124,7 @@ int camera_draw_triangle(Camera *camera,
 {
     trace_assert(camera);
 
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
         log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
@@ -136,7 +144,7 @@ int camera_fill_triangle(const Camera *camera,
 {
     trace_assert(camera);
 
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (camera->debug_mode) {
         if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a / 2) < 0) {
@@ -174,7 +182,7 @@ int camera_render_text(const Camera *camera,
         camera->renderer,
         screen_position,
         vec(size.x * scale.x * camera->scale, size.y * scale.y * camera->scale),
-        camera->blackwhite_mode ? color_desaturate(c) : c,
+        camera_color(camera, c),
         text);
 
     return 0;
@@ -206,7 +214,7 @@ int camera_render_debug_text(const Camera *camera,
 int camera_clear_background(const Camera *camera,
                             Color color)
 {
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
         log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
@@ -389,7 +397,7 @@ int camera_fill_rect_screen(const Camera *camera,
     trace_assert(camera);
 
     const SDL_Rect sdl_rect = rect_for_sdl(rect);
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (camera->debug_mode) {
         if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a / 2) < 0) {
@@ -497,7 +505,7 @@ int camera_draw_line(const Camera *camera,
     const Vec2f camera_begin = camera_point(camera, begin);
     const Vec2f camera_end = camera_point(camera, end);
 
-    const SDL_Color sdl_color = camera_sdl_color(camera, color);
+    const SDL_Color sdl_color = color_for_sdl(camera_color(camera, color));
 
     if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
         log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
index e2cd6b4df630a7cd232af55989d5edae858d99f3..b069869e068712d4e38bc72e202096ab620d3148 100644 (file)
@@ -13,6 +13,7 @@
 typedef struct {
     bool debug_mode;
     bool blackwhite_mode;
+    bool transparent_mode;
     Vec2f position;
     float scale;
     SDL_Renderer *renderer;
index bb9f7ba991c7ed6dc40df4e9dcc73100b865082d..021f1a86cfda03d9cab0852b47f028f7bf83729e 100644 (file)
@@ -34,6 +34,9 @@ typedef enum {
     LEVEL_STATE_PAUSE
 } LevelState;
 
+#define PLATFORM_LAYERS_COUNT 2
+#define PLATFORM_LAYERS_SPEED 8.0f
+
 struct Level
 {
     Lt *lt;
@@ -50,6 +53,14 @@ struct Level
     Labels *labels;
     Regions *regions;
     Phantom_Platforms pp;
+
+    Platforms *platform_layers[PLATFORM_LAYERS_COUNT];
+    size_t current_platforms;
+    size_t prev_platform;
+
+    float a;                    // -1.0 <= a <= 1.0
+                                // abs(a) == 1.0
+    float da;
 };
 
 Level *create_level_from_level_editor(const LevelEditor *level_editor)
@@ -147,6 +158,10 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
 
     level->pp = create_phantom_platforms(level_editor->pp_layer);
 
+    level->platform_layers[0] = level->back_platforms;
+    level->platform_layers[1] = level->platforms;
+    level->current_platforms = 1;
+
     return level;
 }
 
@@ -165,15 +180,43 @@ int level_render(const Level *level, const Camera *camera)
         return -1;
     }
 
-    if (platforms_render(level->back_platforms, camera) < 0) {
-        return -1;
+    // d could-be-= 1.0 / N, but lets assume d = 0.1
+    //
+    //  0     1     2     3     4
+    //              ^
+    // 0.8   0.9   1.0   1.1   1.2
+    //       ^
+    // 0.9   1.0   1.1   1.2   1.3
+    // 1.0 + (i - current) * 0.1
+
+    for (size_t i = 0; i < PLATFORM_LAYERS_COUNT; ++i) {
+        const float d = 0.2f;
+        Camera camera0 = *camera;
+
+        if (level->da == 0.0f) {
+            camera0.scale =
+                fmaxf(0.0f, 1.0f + ((float) i - (float) level->current_platforms) * d);
+        } else {
+            camera0.scale =
+                fmaxf(0.0f, 1.0f + ((float) i - (float) level->prev_platform + level->a) * d);
+        }
+
+
+        if (i != level->current_platforms) {
+            camera0.transparent_mode = 1;
+        }
+
+        platforms_render(level->platform_layers[i], &camera0);
+
+        if (i == level->current_platforms) {
+            if (player_render(level->player, camera) < 0) {
+                return -1;
+            }
+        }
     }
 
     phantom_platforms_render(&level->pp, camera);
 
-    if (player_render(level->player, camera) < 0) {
-        return -1;
-    }
 
     if (boxes_render(level->boxes, camera) < 0) {
         return -1;
@@ -183,10 +226,6 @@ int level_render(const Level *level, const Camera *camera)
         return -1;
     }
 
-    if (platforms_render(level->platforms, camera) < 0) {
-        return -1;
-    }
-
     if (goals_render(level->goals, camera) < 0) {
         return -1;
     }
@@ -217,7 +256,8 @@ 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->platform_layers[level->current_platforms]);
 
     player_die_from_lava(level->player, level->lava);
     regions_player_enter(level->regions, level->player);
@@ -231,6 +271,14 @@ int level_update(Level *level, float delta_time)
     phantom_platforms_hide_at(&level->pp, vec(hitbox.x, hitbox.y));
     phantom_platforms_update(&level->pp, delta_time);
 
+    if (level->da != 0.0f) {
+        level->a += level->da * delta_time;
+        if (fabsf(level->a) > 1.0f) {
+            level->da = 0.0f;
+            level->a = 0.0f;
+        }
+    }
+
     return 0;
 }
 
@@ -258,6 +306,24 @@ int level_event_idle(Level *level, const SDL_Event *event,
         case SDLK_l: {
             camera_toggle_debug_mode(camera);
         } break;
+
+        case SDLK_1: {
+            if (level->current_platforms > 0) {
+                level->a = 0.0f;
+                level->da = PLATFORM_LAYERS_SPEED;
+                level->prev_platform = level->current_platforms;
+                level->current_platforms -= 1;
+            }
+        } break;
+
+        case SDLK_2: {
+            if (level->current_platforms + 1 < PLATFORM_LAYERS_COUNT) {
+                level->a = 0.0f;
+                level->da = -PLATFORM_LAYERS_SPEED;
+                level->prev_platform = level->current_platforms;
+                level->current_platforms += 1;
+            }
+        } break;
         }
         break;
 
index 7b13823f14e1a873687b08dd33cee5c333d0d787..17dcc4df60433b73c6e2f6f58931a8929fadf96b 100644 (file)
@@ -35,6 +35,8 @@ int background_render(const Background *background,
         return -1;
     }
 
+    return 0;
+
     camera.scale = 1.0f - BACKGROUND_LAYERS_STEP * BACKGROUND_LAYERS_COUNT;
 
     for (int l = 0; l < BACKGROUND_LAYERS_COUNT; ++l) {