added screen transitions (C goofy function pointer syntax...)

This commit is contained in:
2024-12-20 22:18:09 +03:00
parent e691768ae0
commit 7670a55e16

View File

@@ -46,6 +46,19 @@ cell* clicked_cell(Minefield* mf, int x, int y);
void expose_cell(Minefield* mf, int r, int c);
void handle_click(Minefield* mf);
typedef enum screens {
GAME_LOOP,
GAME_OVER,
HELP,
} Screen;
Screen game_loop(Minefield* mf);
/* Screen game_over(Minefield* mf); */
Screen help_screen(Minefield* mf);
Screen (*screen_fn(Screen scr))(Minefield *);
Screen last_screen;
const int screenWidth = 800;
const int screenHeight = 450;
float cell_size;
@@ -67,16 +80,11 @@ int main(){
InitWindow(screenWidth, screenHeight, "Minesweeper");
SetTargetFPS(60);
Screen screen = GAME_LOOP;
Screen (*loop)(Minefield*);
while(!WindowShouldClose()){
if (!dead){
handle_click(&mf);
}
BeginDrawing();
ClearBackground(RAYWHITE);
draw_minefield(&mf);
EndDrawing();
loop = screen_fn(screen);
screen = (*loop)(&mf);
}
free_minefield(&mf);
@@ -84,6 +92,51 @@ int main(){
return 0;
}
Screen game_loop(Minefield* mf){
while(!WindowShouldClose()){
if (IsKeyPressed(KEY_H)){
break;
}
if (!dead){
handle_click(mf);
}
BeginDrawing();
ClearBackground(RAYWHITE);
draw_minefield(mf);
EndDrawing();
}
last_screen = GAME_LOOP;
return HELP;
}
Screen help_screen(Minefield* mf){
while(!WindowShouldClose() && IsKeyDown(KEY_H)){
BeginDrawing();
ClearBackground(RAYWHITE);
DrawText("Left Mouse Click - Open tile.", 100, 100, 30, BLACK);
DrawText("Right Mouse Click - Mark tile.", 100, 150, 30, BLACK);
EndDrawing();
}
return last_screen;
}
Screen (*screen_fn(Screen scr))(Minefield *) {
switch (scr) {
case GAME_LOOP:
return game_loop;
/* case GAME_OVER: */
/* return game_loop; */
case HELP:
return help_screen;
default:
return game_loop;
}
}
Minefield make_minefield(int row, int col, int mine_count){
Minefield mf = {.row = row, .col = col};
int size = mf.row * mf.col;
@@ -173,7 +226,7 @@ void draw_minefield(Minefield* mf){
}
char time_str[20];
float time = GetTime();
snprintf(time_str, 100, "%02d.%02d - %d/%d",
snprintf(time_str, 20, "%02d.%02d - %d/%d",
(int) time / 60, (int) time % 60,
mark_count, mf->mine_count);
DrawText(time_str, screenWidth / 2 - 20, screenHeight - 30, 20, BLACK);