Parcourir la source

Updated Scufeng. Gameover screen.

Aaro Saila il y a 2 semaines
Parent
commit
7069ae345b

+ 12 - 4
src/common/game.c

@@ -313,16 +313,24 @@ GameStateEvent GameState_update(GameState *const state, const double delta) {
     case GSEVENT_L_SCORE:
         state->score_l++;
         game_next_round(state);
-        return event;
-        break;
+        if (state->score_l > 5) {
+            return GSEVENT_L_WIN;
+        } else {
+            return event;
+        }
     case GSEVENT_R_SCORE:
         state->score_r++;
         game_next_round(state);
-        return event;
-        break;
+        if (state->score_r > 5) {
+            return GSEVENT_R_WIN;
+        } else {
+            return event;
+        }
     case GSEVENT_NONE:
     case GSEVENT_BALL_DIR_CHANGE:
         break;
+    default:
+        break;
     }
 
     return event;

+ 3 - 1
src/common/game.h

@@ -11,7 +11,9 @@
     X(GSEVENT_NONE) \
     X(GSEVENT_L_SCORE) \
     X(GSEVENT_R_SCORE) \
-    X(GSEVENT_BALL_DIR_CHANGE)
+    X(GSEVENT_BALL_DIR_CHANGE) \
+    X(GSEVENT_L_WIN) \
+    X(GSEVENT_R_WIN)
 
 #define X(evt) evt,
 

+ 12 - 1
src/game/SinglePlayer.c

@@ -59,7 +59,18 @@ Screen SinglePlayer_tick(SinglePlayer *const sp, const double delta) {
     if (key_input_handle(&sp->state)) {
         return PONG_MAIN_MENU;
     }
-    GameState_update(&sp->state, delta);
+    const GameStateEvent evt = GameState_update(&sp->state, delta);
+    switch (evt) {
+    case GSEVENT_L_WIN:
+        win_lose_render(true, sp->screen_w, sp->screen_h);
+        return PONG_MAIN_MENU;
+    case GSEVENT_R_WIN:
+        win_lose_render(false, sp->screen_w, sp->screen_h);
+        return PONG_MAIN_MENU;
+    default:
+        break;
+    }
+
     GameShapes_update(&sp->shapes, &sp->state, sp->screen_w, sp->screen_h);
     GameShapes_render(&sp->shapes, &sp->state, sp->screen_w, sp->screen_h);
 

+ 36 - 0
src/game/game_common.c

@@ -1,4 +1,5 @@
 #include <stdio.h>
+#include <unistd.h>
 
 #include "cglm/vec4.h"
 #include "cglm/vec3.h"
@@ -102,3 +103,38 @@ void GameShapes_render(
         GLM_VEC3_ONE
     );
 }
+
+void win_lose_render(
+    const bool win,
+    const unsigned int screen_w,
+    const unsigned int screen_h
+) {
+    const char *text_str = win ? "You Win!" : "You Lose!";
+    SEMesh text = SEMesh_string_alloc(
+        text_str,
+        1.0f,
+        (vec3) { 1.0f, 1.0f, 1.0f }
+    );
+    text.transform.pos[0] = screen_w / 2.0f;
+    text.transform.pos[1] = screen_h / 2.0f;
+
+    vec2 text_dims;
+    SEMesh_rect_dims_get(&text, text_dims);
+    SEMesh bg = SEMesh_rect_color_alloc((vec4) {
+        0.2f, 0.2f, 0.2f, 1.0f });
+    bg.transform.pos[0] = screen_w / 2.0f;
+    bg.transform.pos[1] = screen_h / 2.0f;
+    bg.transform.scale[0] = text_dims[0] * 2.0f;
+    bg.transform.scale[1] = text_dims[1] * 2.0f;
+
+    SEMesh *const meshes[] = {
+        &bg,
+        &text,
+    };
+
+    SEMesh_render_multiple_2d(meshes, sizeof(meshes) / sizeof(meshes[0]));
+    se_swap_buffers();
+    sleep(2);
+
+    SEMesh_free(&text);
+}

+ 5 - 0
src/game/game_common.h

@@ -36,3 +36,8 @@ void GameShapes_render(
     const unsigned int screen_w,
     const unsigned int screen_h
 );
+void win_lose_render(
+    const bool win,
+    const unsigned int screen_w,
+    const unsigned int screen_h
+);

+ 1 - 1
subprojects/scufeng-x86_64/GIT_COMMIT

@@ -1 +1 @@
-3d9992ca62d6e6ac615a8a069e4b898a93d96fef
+16d65894711b730f829790748d3802c4603d4a8c

+ 1 - 0
subprojects/scufeng-x86_64/include/scufeng/Mesh.h

@@ -55,6 +55,7 @@ void SEMesh_free(SEMesh *const mesh);
 void SEMesh_set_draw_mode(SEMesh *mesh, const SEDrawMode mode);
 void SEMesh_render(const SEMesh *const mesh);
 void SEMesh_color_set(SEMesh *const mesh, const vec4 color);
+void SEMesh_rect_dims_get(const SEMesh *const mesh, vec2 dims);
 void SEMesh_line_segment_coords_set(SEMesh *const mesh, const vec2 a, const vec2 b);
 SEMesh SEMesh_line_segment_color_alloc(const vec2 a, const vec2 b, const vec4 color);
 void SEMesh_bbox_render_2d(const SEMesh *const mesh);

BIN
subprojects/scufeng-x86_64/libscufeng.a