added screen transitions (C goofy function pointer syntax...)
This commit is contained in:
@@ -46,6 +46,19 @@ cell* clicked_cell(Minefield* mf, int x, int y);
|
|||||||
void expose_cell(Minefield* mf, int r, int c);
|
void expose_cell(Minefield* mf, int r, int c);
|
||||||
void handle_click(Minefield* mf);
|
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 screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
float cell_size;
|
float cell_size;
|
||||||
@@ -67,16 +80,11 @@ int main(){
|
|||||||
InitWindow(screenWidth, screenHeight, "Minesweeper");
|
InitWindow(screenWidth, screenHeight, "Minesweeper");
|
||||||
SetTargetFPS(60);
|
SetTargetFPS(60);
|
||||||
|
|
||||||
|
Screen screen = GAME_LOOP;
|
||||||
|
Screen (*loop)(Minefield*);
|
||||||
while(!WindowShouldClose()){
|
while(!WindowShouldClose()){
|
||||||
|
loop = screen_fn(screen);
|
||||||
if (!dead){
|
screen = (*loop)(&mf);
|
||||||
handle_click(&mf);
|
|
||||||
}
|
|
||||||
|
|
||||||
BeginDrawing();
|
|
||||||
ClearBackground(RAYWHITE);
|
|
||||||
draw_minefield(&mf);
|
|
||||||
EndDrawing();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free_minefield(&mf);
|
free_minefield(&mf);
|
||||||
@@ -84,6 +92,51 @@ int main(){
|
|||||||
return 0;
|
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 make_minefield(int row, int col, int mine_count){
|
||||||
Minefield mf = {.row = row, .col = col};
|
Minefield mf = {.row = row, .col = col};
|
||||||
int size = mf.row * mf.col;
|
int size = mf.row * mf.col;
|
||||||
@@ -173,7 +226,7 @@ void draw_minefield(Minefield* mf){
|
|||||||
}
|
}
|
||||||
char time_str[20];
|
char time_str[20];
|
||||||
float time = GetTime();
|
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,
|
(int) time / 60, (int) time % 60,
|
||||||
mark_count, mf->mine_count);
|
mark_count, mf->mine_count);
|
||||||
DrawText(time_str, screenWidth / 2 - 20, screenHeight - 30, 20, BLACK);
|
DrawText(time_str, screenWidth / 2 - 20, screenHeight - 30, 20, BLACK);
|
||||||
|
|||||||
Reference in New Issue
Block a user