Game state machine

This commit is contained in:
KikooDX 2021-04-12 10:59:46 +02:00
parent 2481f73b62
commit 87d6abbb42
7 changed files with 158 additions and 54 deletions

View File

@ -36,10 +36,13 @@ set(SOURCES
src/particles/update.c
src/particles/draw.c
src/particles/create.c
src/transition/draw.c
src/transition/fade.c
src/transition/init.c
src/transition/update.c
src/transition/draw.c
src/transition/fade.c
src/titlescreen/init.c
src/titlescreen/update.c
src/titlescreen/draw.c
)
set(ASSETS

5
include/game_state.h Normal file
View File

@ -0,0 +1,5 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright (C) 2021 KikooDX */
#pragma once
enum GameState { TitleScreen, MainMenu, LevelSelection, Playing };

12
include/titlescreen.h Normal file
View File

@ -0,0 +1,12 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright (C) 2021 KikooDX */
#pragma once
struct TitleScreen {
int placeholder;
};
struct TitleScreen titlescreen_init(void);
/* Return 1 if game state should change. */
int titlescreen_update(struct TitleScreen *titlescreen);
void titlescreen_draw(struct TitleScreen titlescreen);

View File

@ -2,9 +2,11 @@
/* Copyright (C) 2021 KikooDX */
#include "conf.h"
#include "game_state.h"
#include "level.h"
#include "particles.h"
#include "player.h"
#include "titlescreen.h"
#include "transition.h"
#include <gint/clock.h>
#include <gint/display.h>
@ -44,8 +46,11 @@ int main(void)
int timer;
int player_return_code;
enum TransitionMode transition_previous_mode;
enum GameState game_state = Playing;
volatile int has_ticked = 1;
struct TitleScreen titlescreen = titlescreen_init();
/* load level */
level_id = 0;
gint_switch(level_load);
@ -74,65 +79,109 @@ int main(void)
while (!has_ticked)
sleep();
has_ticked = 0;
/* update */
clearevents();
if (transition.mode == TransitionNone) {
particles_update();
player_return_code =
player_update(&player);
switch (player_return_code) {
case 1:
level_id += 1;
transition = transition_init(
H_TRANS_SPD, C_BLUE,
TransitionHOut);
break;
case -1:
transition = transition_init(
V_TRANS_SPD, C_RED,
TransitionVOut);
break;
default:
break;
switch (game_state) {
case TitleScreen:
if (titlescreen_update(&titlescreen))
game_state = Playing;
break;
case MainMenu:
break;
case LevelSelection:
break;
case Playing:
if (transition.mode == TransitionNone) {
particles_update();
player_return_code =
player_update(&player);
switch (player_return_code) {
case 1:
level_id += 1;
transition =
transition_init(
H_TRANS_SPD,
C_BLUE,
TransitionHOut);
break;
case -1:
transition =
transition_init(
V_TRANS_SPD,
C_RED,
TransitionVOut);
break;
default:
break;
}
}
}
transition_previous_mode =
transition_update(&transition);
if (transition_previous_mode !=
transition.mode &&
transition_previous_mode !=
TransitionNone) {
switch (transition_previous_mode) {
case TransitionNone:
break;
case TransitionHIn:
break;
case TransitionHOut:
LOAD_LEVEL();
transition = transition_init(
transition.speed,
transition.color,
TransitionHIn);
break;
case TransitionVIn:
break;
case TransitionVOut:
LOAD_LEVEL();
transition = transition_init(
transition.speed,
transition.color,
TransitionVIn);
break;
default:
break;
transition_previous_mode =
transition_update(&transition);
if (transition_previous_mode !=
transition.mode &&
transition_previous_mode !=
TransitionNone) {
switch (
transition_previous_mode) {
case TransitionNone:
break;
case TransitionHIn:
break;
case TransitionHOut:
LOAD_LEVEL();
transition =
transition_init(
transition
.speed,
transition
.color,
TransitionHIn);
break;
case TransitionVIn:
break;
case TransitionVOut:
LOAD_LEVEL();
transition =
transition_init(
transition
.speed,
transition
.color,
TransitionVIn);
break;
default:
break;
}
}
break;
default:
PANIC(
"missing game_state case (update)");
break;
}
/* draw */
dclear(C_BLACK);
level_draw();
particles_draw();
player_draw(player);
transition_draw(transition);
switch (game_state) {
case TitleScreen:
titlescreen_draw(titlescreen);
break;
case MainMenu:
break;
case LevelSelection:
break;
case Playing:
level_draw();
particles_draw();
player_draw(player);
transition_draw(transition);
break;
default:
PANIC("missing game_state case (draw)");
break;
}
dupdate();
}
}

11
src/titlescreen/draw.c Normal file
View File

@ -0,0 +1,11 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright (C) 2021 KikooDX */
#include "titlescreen.h"
#include <gint/display.h>
void titlescreen_draw(struct TitleScreen titlescreen)
{
dprint_opt(DWIDTH / 2, DHEIGHT * 2 / 3, C_WHITE, C_NONE,
DTEXT_CENTER, DTEXT_MIDDLE, "PRESS SHIFT");
}

9
src/titlescreen/init.c Normal file
View File

@ -0,0 +1,9 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright (C) 2021 KikooDX */
#include "titlescreen.h"
struct TitleScreen titlescreen_init(void)
{
return (struct TitleScreen){0};
}

15
src/titlescreen/update.c Normal file
View File

@ -0,0 +1,15 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright (C) 2021 KikooDX */
#include "titlescreen.h"
#include <gint/keyboard.h>
/* Return 1 if game state should change. */
int titlescreen_update(struct TitleScreen *titlescreen)
{
if (keydown(KEY_SHIFT)) {
return 1;
}
return 0;
}