added options menu and fade-in

This commit is contained in:
Return0ne 2022-07-19 11:04:05 -04:00
parent 851a13ce0d
commit 502fa8a924
11 changed files with 297 additions and 82 deletions

View File

@ -381,7 +381,8 @@ PROJECT_SOURCE_FILES ?= \
$(PROJECT_SOURCE_PATH)/Gameplay.c \ $(PROJECT_SOURCE_PATH)/Gameplay.c \
$(PROJECT_SOURCE_PATH)/Title.c \ $(PROJECT_SOURCE_PATH)/Title.c \
$(PROJECT_SOURCE_PATH)/Credits.c \ $(PROJECT_SOURCE_PATH)/Credits.c \
$(PROJECT_SOURCE_PATH)/Gameover.c $(PROJECT_SOURCE_PATH)/Gameover.c \
$(PROJECT_SOURCE_PATH)/Options.c
# Define all object files from source files # Define all object files from source files
OBJS = $(patsubst %.c, %.o, $(PROJECT_SOURCE_FILES)) OBJS = $(patsubst %.c, %.o, $(PROJECT_SOURCE_FILES))

View File

@ -4,8 +4,10 @@ A dumb raylib test which you can play [here](https://canneddonuts.itch.io/avoid-
## To-do ## To-do
- a build guide - a build guide
- multiple stages - multiple stages
- an options menu
- a tutorial - a tutorial
## Note
This games code more specifically 'Main.c' is a retyped version of this [repo](https://github.com/raysan5/raylib-game-template) which is code under the zlib license.
## Preview ## Preview
![Alt Text](./doc-assets/preview.png) ![Alt Text](./doc-assets/preview.png)

View File

@ -12,9 +12,16 @@
#include "Controls.h" #include "Controls.h"
#include "Textures.h" #include "Textures.h"
int finishfromCreditsScreen = 0;
void InitCreditsScreen(void)
{
finishfromCreditsScreen = 0;
}
void UpdateCreditsScreen(void) void UpdateCreditsScreen(void)
{ {
if (INPUT_OPTION_PRESSED) currentScreen = TITLE; if (INPUT_OPTION_PRESSED) finishfromCreditsScreen = 1;
} }
void DrawCreditsScreen(void) void DrawCreditsScreen(void)
@ -27,3 +34,13 @@ void DrawCreditsScreen(void)
DrawText(TextFormat("Build compiled on %s", __DATE__), 10, 310, 30, GREEN); DrawText(TextFormat("Build compiled on %s", __DATE__), 10, 310, 30, GREEN);
DrawText("Press 'ENTER' ", 10, 350, 20, WHITE); DrawText("Press 'ENTER' ", 10, 350, 20, WHITE);
} }
int FinishCreditsScreen(void)
{
return finishfromCreditsScreen;
}
void UnloadCreditsScreen(void)
{
}

View File

@ -11,11 +11,12 @@
#include "Screens.h" #include "Screens.h"
#include "Controls.h" #include "Controls.h"
int gameoverSelected = 0; int gameoverSelected = 0, finishfromGameoverScreen = 0;
void InitGameoverScreen(void) void InitGameoverScreen(void)
{ {
gameoverSelected = 0; gameoverSelected = 0;
finishfromGameoverScreen = 0;
} }
void UpdateGameoverScreen(void) void UpdateGameoverScreen(void)
@ -26,10 +27,10 @@ void UpdateGameoverScreen(void)
if (gameoverSelected < -1) gameoverSelected++; if (gameoverSelected < -1) gameoverSelected++;
if ((gameoverSelected == 0) && (INPUT_OPTION_PRESSED)) if ((gameoverSelected == 0) && (INPUT_OPTION_PRESSED))
currentScreen = GAMEPLAY; finishfromGameoverScreen = 2;
if ((gameoverSelected == -1) && (INPUT_OPTION_PRESSED)) if ((gameoverSelected == -1) && (INPUT_OPTION_PRESSED))
currentScreen = TITLE; finishfromGameoverScreen = 1;
} }
void DrawGameoverScreen(void) void DrawGameoverScreen(void)
@ -42,3 +43,13 @@ void DrawGameoverScreen(void)
if (gameoverSelected == -1) DrawText("TITLE", 352, 230, 20, WHITE); if (gameoverSelected == -1) DrawText("TITLE", 352, 230, 20, WHITE);
else DrawText("TITLE", 352, 230, 20, RED); else DrawText("TITLE", 352, 230, 20, RED);
} }
int FinishGameoverScreen(void)
{
return finishfromGameoverScreen;
}
void UnloadGameoverScreen(void)
{
}

View File

@ -10,12 +10,13 @@
#include "Screens.h" #include "Screens.h"
#include "Controls.h" #include "Controls.h"
#include "Options.h"
#include "Gameplay.h" #include "Gameplay.h"
#include "Score.h" #include "Score.h"
#include "Timers.h" #include "Timers.h"
#include "Textures.h" #include "Textures.h"
int score = 0, bestscore = 0; int score = 0, bestscore = 0, finishfromGameplayScreen = 0;
void LoadGamplayScreen(void) void LoadGamplayScreen(void)
{ {
@ -31,6 +32,8 @@ void LoadGamplayScreen(void)
void InitGameplayScreen(void) void InitGameplayScreen(void)
{ {
finishfromGameplayScreen = 0;
SetMasterVolume(0.5); SetMasterVolume(0.5);
player.currentframe = 0; player.currentframe = 0;
@ -155,8 +158,6 @@ void UpdateiFrameTimer(void)
void UpdateGameplayScreen(void) void UpdateGameplayScreen(void)
{ {
if (IsKeyPressed(KEY_M)) mute = !mute;
if (INPUT_OPTION_PRESSED) pause = !pause; if (INPUT_OPTION_PRESSED) pause = !pause;
if (!pause) { if (!pause) {
@ -220,13 +221,11 @@ void UpdateGameplayScreen(void)
if (IsKeyPressed(KEY_R)) { if (IsKeyPressed(KEY_R)) {
gameReset(); finishfromGameplayScreen = 2;
currentScreen = TITLE;
} }
if (player.hp <= 0) { if (player.hp <= 0) {
gameReset(); finishfromGameplayScreen = 1;
currentScreen = GAMEOVER;
} }
for (int i = 0; i < MAX_SHOOTS; i++) { for (int i = 0; i < MAX_SHOOTS; i++) {
@ -357,8 +356,7 @@ void UnloadGameplayScreen()
UnloadTexture(attack_sprite); UnloadTexture(attack_sprite);
} }
void gameReset(void) int FinishGameplayScreen(void)
{ {
InitGameplayScreen(); return finishfromGameplayScreen;
InitGameoverScreen();
} }

View File

@ -48,7 +48,6 @@ Sound fxhit = { 0 };
Sound fxfeather = { 0 }; Sound fxfeather = { 0 };
Sound fxboom = { 0 }; Sound fxboom = { 0 };
bool pause; bool pause;
bool mute = false;
bool player_in; bool player_in;
bool enemy_hurt; bool enemy_hurt;
int ammo = 0; int ammo = 0;

View File

@ -9,6 +9,7 @@
#include "../include/raylib.h" #include "../include/raylib.h"
#include "Screens.h" #include "Screens.h"
#include "Options.h"
#if defined(PLATFORM_WEB) #if defined(PLATFORM_WEB)
#include <emscripten/emscripten.h> #include <emscripten/emscripten.h>
@ -18,6 +19,12 @@
static const int screenWidth = 800; static const int screenWidth = 800;
static const int screenHeight = 450; static const int screenHeight = 450;
static float transAlpha = 0.0f;
static bool onTransition = false;
static bool transFadeOut = false;
static int transFromScreen = -1;
static int transToScreen = -1;
GameScreen currentScreen = 0; GameScreen currentScreen = 0;
Texture2D background; Texture2D background;
@ -29,10 +36,11 @@ Texture2D attack_sprite;
// Game functions // Game functions
static void gameSetup(void); static void gameSetup(void);
static void updateGame(void); static void update_draw_frame(void);
static void drawGame(void);
static void gameLoop(void);
static void unloadGame(void); static void unloadGame(void);
static void transition_to_screen(int screen);
static void update_transition(void);
static void draw_transition(void);
int main(void) int main(void)
{ {
@ -43,11 +51,11 @@ int main(void)
gameSetup(); gameSetup();
#if defined(PLATFORM_WEB) #if defined(PLATFORM_WEB)
emscripten_set_main_loop(gameLoop, 60, 1); emscripten_set_main_loop(update_draw_frame, 60, 1);
#else #else
SetTargetFPS(60); SetTargetFPS(60);
while (!WindowShouldClose()) gameLoop(); while (!WindowShouldClose()) update_draw_frame();
#endif #endif
unloadGame(); unloadGame();
@ -63,52 +71,134 @@ void gameSetup(void)
{ {
// asset loading & setting of variable values // asset loading & setting of variable values
currentScreen = TITLE; currentScreen = TITLE;
background = LoadTexture("assets/gfx/background.png");
LoadGamplayScreen();
InitGameplayScreen();
InitTitleScreen();
} }
void updateGame(void)
{
// code that runs as long as the program is running
if ((IsKeyDown(KEY_LEFT_ALT)) && (IsKeyPressed(KEY_F))) ToggleFullscreen();
switch (currentScreen) { static void transition_to_screen(int screen)
case TITLE: UpdateTitleScreen(); break; {
case GAMEPLAY: UpdateGameplayScreen(); break; onTransition = true;
case GAMEOVER: UpdateGameoverScreen(); break; transFadeOut = false;
case CREDITS: UpdateCreditsScreen(); break; transFromScreen = currentScreen;
default: break; transToScreen = screen;
transAlpha = 0.0f;
}
static void update_transition(void)
{
if (!transFadeOut) {
transAlpha += 0.05f;
if (transAlpha > 1.01f) {
transAlpha = 1.0f;
switch (transFromScreen) {
case TITLE: UnloadTitleScreen(); break;
case GAMEPLAY: UnloadGameplayScreen(); break;
case GAMEOVER: UnloadGameoverScreen(); break;
case CREDITS: UnloadCreditsScreen(); break;
case OPTIONS: UnloadOptionsScreen(); break;
default: break;
}
switch (transToScreen) {
case TITLE: InitTitleScreen(); break;
case GAMEPLAY: LoadGamplayScreen(); InitGameplayScreen(); break;
case GAMEOVER: InitGameoverScreen(); break;
case CREDITS: InitCreditsScreen(); break;
case OPTIONS: InitOptionsScreen(); break;
default: break;
}
currentScreen = transToScreen;
transFadeOut = true;
}
} else {
transAlpha -= 0.02f;
if (transAlpha < -0.01f) {
transAlpha = 0.0f;
transFadeOut = false;
onTransition = false;
transFromScreen = -1;
transToScreen = -1;
}
} }
} }
void drawGame(void) static void draw_transition(void)
{ {
// code to render the game to the game window DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, transAlpha));
}
static void update_draw_frame(void)
{
if (IsKeyPressed(KEY_M)) mute = !mute;
if ((IsKeyDown(KEY_LEFT_ALT)) && (IsKeyPressed(KEY_F))) { ToggleFullscreen(); fullscreen = !fullscreen; }
if (!onTransition) {
switch (currentScreen) {
case TITLE: {
UpdateTitleScreen();
if (FinishTitleScreen() == 1) transition_to_screen(CREDITS);
else if (FinishTitleScreen() == 2) transition_to_screen(GAMEPLAY);
else if (FinishTitleScreen() == 3) transition_to_screen(OPTIONS);
} break;
case CREDITS: {
UpdateCreditsScreen();
if (FinishCreditsScreen() == 1) transition_to_screen(TITLE);
} break;
case GAMEPLAY: {
UpdateGameplayScreen();
if (FinishGameplayScreen() == 1) transition_to_screen(GAMEOVER);
else if (FinishGameplayScreen() == 2) transition_to_screen(TITLE);
} break;
case GAMEOVER: {
UpdateGameoverScreen();
if (FinishGameoverScreen() == 1) transition_to_screen(TITLE);
else if (FinishGameoverScreen() == 2) transition_to_screen(GAMEPLAY);
} break;
case OPTIONS: {
UpdateOptionsScreen();
if (FinishOptionsScreen() == 1) transition_to_screen(TITLE);
} break;
default: break;
}
} else update_transition();
BeginDrawing(); BeginDrawing();
ClearBackground(RAYWHITE); ClearBackground(RAYWHITE);
switch (currentScreen) { switch (currentScreen) {
case TITLE: DrawTitleScreen(); break; case TITLE: DrawTitleScreen(); break;
case GAMEPLAY: DrawGameplayScreen(); break; case CREDITS: DrawCreditsScreen(); break;
case GAMEOVER: DrawGameoverScreen(); break; case GAMEPLAY: DrawGameplayScreen(); break;
case CREDITS: DrawCreditsScreen(); break; case GAMEOVER: DrawGameoverScreen(); break;
default: break; case OPTIONS: DrawOptionsScreen(); break;
} default: break;
}
if (onTransition) draw_transition();
EndDrawing(); EndDrawing();
} }
void gameLoop(void) static void unloadGame(void)
{ {
updateGame(); switch (currentScreen) {
drawGame(); case TITLE: UnloadTitleScreen(); break;
} case GAMEPLAY: UnloadGameplayScreen(); break;
case GAMEOVER: UnloadGameoverScreen(); break;
void unloadGame(void) case CREDITS: UnloadCreditsScreen(); break;
{ case OPTIONS: UnloadOptionsScreen(); break;
UnloadGameplayScreen(); default: break;
UnloadTitleScreen(); }
} }

68
src/Options.c Normal file
View File

@ -0,0 +1,68 @@
/*
- Avoid ~ a game by Canneddonuts
- Filename ~ Options.c
- Author ~ Return0ne
- 2022
- *no license*
*/
#include "../include/raylib.h"
#include "Screens.h"
#include "Textures.h"
#include "Controls.h"
#include "Options.h"
int optionsSelected = 0, finishfromOptionsScreen = 0;
void InitOptionsScreen(void)
{
finishfromOptionsScreen = 0;
optionsSelected = 0;
}
void UpdateOptionsScreen(void)
{
if (INPUT_UP_PRESSED) optionsSelected++;
if (INPUT_DOWN_PRESSED) optionsSelected--;
if (optionsSelected > 0) optionsSelected--;
if (optionsSelected < -2) optionsSelected++;
if ((optionsSelected == 0) && (INPUT_OPTION_PRESSED)) finishfromOptionsScreen = 1;
if ((optionsSelected == -1) && (INPUT_OPTION_PRESSED)) mute = !mute;
if ((optionsSelected == -2) && (INPUT_OPTION_PRESSED)) { ToggleFullscreen(); fullscreen = !fullscreen; }
}
void DrawOptionsScreen(void)
{
DrawTexture(background, 0, 0, DARKGRAY);
DrawText("OPTIONS", 300, 20, 50, BLUE);
if (optionsSelected == 0) DrawText("Back", 20, 200, 20, WHITE);
else DrawText("Back", 20, 200, 20, BLUE);
if (optionsSelected == -1) {
DrawText("Mute", 20, 220, 20, WHITE);
DrawText(TextFormat("<%i>", mute), 200, 220, 20, WHITE);
}
else {
DrawText("Mute", 20, 220, 20, BLUE);
DrawText(TextFormat("<%i>", mute), 200, 220, 20, BLUE);
}
if (optionsSelected == -2) {
DrawText("Fullscreen", 20, 240, 20, WHITE);
DrawText(TextFormat("<%i>", fullscreen), 200, 240, 20, WHITE);
}
else {
DrawText("Fullscreen", 20, 240, 20, BLUE);
DrawText(TextFormat("<%i>", fullscreen), 200, 240, 20, BLUE);
}
}
void UnloadOptionsScreen(void)
{
}
int FinishOptionsScreen(void)
{
return finishfromOptionsScreen;
}

15
src/Options.h Normal file
View File

@ -0,0 +1,15 @@
/*
- Avoid ~ a game by Canneddonuts
- Filename ~ Options.h
- Author ~ Return0ne
- 2022
- *no license*
*/
#ifndef OPTIONS_HEADER
#define OPTIONS_HEADER
bool mute;
bool fullscreen;
#endif

View File

@ -9,31 +9,39 @@
#ifndef SCREENS_HEADER #ifndef SCREENS_HEADER
#define SCREENS_HEADER #define SCREENS_HEADER
typedef enum GameScreen { TITLE = 0, GAMEPLAY, GAMEOVER, CREDITS } GameScreen; typedef enum GameScreen { TITLE = 0, GAMEPLAY, GAMEOVER, CREDITS, OPTIONS } GameScreen;
extern GameScreen currentScreen; extern GameScreen currentScreen;
void gameReset(void);
void InitTitleScreen(void); void InitTitleScreen(void);
void UpdateTitleScreen(void); void UpdateTitleScreen(void);
void DrawTitleScreen(void); void DrawTitleScreen(void);
void UnloadTitleScreen(void); void UnloadTitleScreen(void);
int FinishTitleScreen(void);
void InitGameplayScreen(void); void InitGameplayScreen(void);
void UpdateGameplayScreen(void); void UpdateGameplayScreen(void);
void DrawGameplayScreen(void); void DrawGameplayScreen(void);
void UnloadGameplayScreen(void); void UnloadGameplayScreen(void);
void LoadGamplayScreen(void); void LoadGamplayScreen(void);
int FinishGameplayScreen(void);
void InitCreditsScreen(void);
void UpdateCreditsScreen(void); void UpdateCreditsScreen(void);
void DrawCreditsScreen(void); void DrawCreditsScreen(void);
void UnloadCreditsScreen(void);
int FinishCreditsScreen(void);
void InitGameoverScreen(void); void InitGameoverScreen(void);
void UpdateGameoverScreen(void); void UpdateGameoverScreen(void);
void DrawGameoverScreen(void); void DrawGameoverScreen(void);
void UnloadGameoverScreen(void);
int FinishGameoverScreen(void);
void InitOptionsScreen(void);
void UpdateOptionsScreen(void);
void DrawOptionsScreen(void);
void UnloadOptionsScreen(void);
int FinishOptionsScreen(void);
#endif #endif

View File

@ -1,6 +1,6 @@
/* /*
- Avoid ~ a game by Canneddonuts - Avoid ~ a game by Canneddonuts
- Filename ~ Title.h - Filename ~ Title.c
- Author ~ Return0ne - Author ~ Return0ne
- 2022 - 2022
- *no license* - *no license*
@ -13,7 +13,7 @@
#include "Score.h" #include "Score.h"
#include "Textures.h" #include "Textures.h"
int titleSelected = 0; int titleSelected = 0, finishfromTitleScreen = 0;
void DrawScore(void) void DrawScore(void)
{ {
@ -27,9 +27,10 @@ void DrawScore(void)
DrawText(TextFormat("BEST: %i", bestscore), 600, 0, 30, BLUE); DrawText(TextFormat("BEST: %i", bestscore), 600, 0, 30, BLUE);
} }
void InitTitleScreen(void) void InitTitleScreen(void)
{ {
background = LoadTexture("assets/gfx/background.png"); finishfromTitleScreen = 0;
} }
void UpdateTitleScreen(void) void UpdateTitleScreen(void)
@ -39,36 +40,41 @@ void UpdateTitleScreen(void)
if (titleSelected > 0) titleSelected--; if (titleSelected > 0) titleSelected--;
if (titleSelected < -2) titleSelected++; if (titleSelected < -2) titleSelected++;
if ((titleSelected == 0) && (INPUT_OPTION_PRESSED)) currentScreen = GAMEPLAY; if ((titleSelected == 0) && (INPUT_OPTION_PRESSED)) finishfromTitleScreen = 2;
if ((titleSelected == -1) && (INPUT_OPTION_PRESSED)) currentScreen = CREDITS; if ((titleSelected == -1) && (INPUT_OPTION_PRESSED)) finishfromTitleScreen = 1;
if ((titleSelected == -2) && (INPUT_OPTION_PRESSED)) OpenURL("https://canneddonuts.itch.io/"); if ((titleSelected == -2) && (INPUT_OPTION_PRESSED)) finishfromTitleScreen = 3;
} }
void DrawTitleScreen(void) void DrawTitleScreen(void)
{ {
DrawTexture(background, 0, 0, GRAY); DrawTexture(background, 0, 0, GRAY);
DrawText("Controls", 10, 10, 30, BLUE);
DrawScore();
DrawText("Press the arrow keys or 'DPAD' to move and 'X' to dash", 10, 40, 10, WHITE);
DrawText("Press 'ENTER' or 'START' to pause", 10, 60, 10, WHITE);
DrawText("Press 'M' to mute", 10, 80, 10, WHITE);
DrawText("Press 'Left-ALT' + 'F' for full screen", 10, 100, 10, WHITE);
DrawText("Press 'R' to restart", 10, 120, 10, WHITE);
DrawText("Press 'ENTER' or 'START' to select an option", 10, 140, 10, WHITE);
DrawText("Press 'X' or 'A' on a gamepad to shoot", 10, 160, 10, WHITE);
DrawText("Avoid", 330, 20, 50, BLUE); DrawText("Avoid", 330, 20, 50, BLUE);
DrawText("Controls", 10, 10, 30, BLUE);
DrawScore();
DrawText("Press the arrow keys or 'DPAD' to move and 'X' to dash", 10, 40, 10, WHITE);
DrawText("Press 'ENTER' or 'START' to pause", 10, 60, 10, WHITE);
DrawText("Press 'M' to mute", 10, 80, 10, WHITE);
DrawText("Press 'Left-ALT' + 'F' for full screen", 10, 100, 10, WHITE);
DrawText("Press 'R' to restart", 10, 120, 10, WHITE);
DrawText("Press 'ENTER' or 'START' to select an option", 10, 140, 10, WHITE);
DrawText("Press 'X' or 'A' on a gamepad to shoot", 10, 160, 10, WHITE);
// DrawText("Ver: 0.1", 680, 420, 30, WHITE); // DrawText("Ver: 0.1", 680, 420, 30, WHITE);
if (titleSelected == 0) DrawText("PLAY", 360, 220, 20, WHITE); if (titleSelected == 0) DrawText("PLAY", 360, 220, 20, WHITE);
else DrawText("PLAY", 360, 220, 20, BLUE); else DrawText("PLAY", 360, 220, 20, BLUE);
if (titleSelected == -1) DrawText("CREDITS", 340, 240, 20, WHITE); if (titleSelected == -1) DrawText("CREDITS", 340, 240, 20, WHITE);
else DrawText("CREDITS", 340, 240, 20, BLUE); else DrawText("CREDITS", 340, 240, 20, BLUE);
if (titleSelected == -2) DrawText("MORE GAMES", 320, 260, 20, WHITE); if (titleSelected == -2) DrawText("OPTIONS", 340, 260, 20, WHITE);
else DrawText("MORE GAMES", 320, 260, 20, BLUE); else DrawText("OPTIONS", 340, 260, 20, BLUE);
} }
void UnloadTitleScreen(void) void UnloadTitleScreen(void)
{ {
UnloadTexture(background);
}
int FinishTitleScreen(void)
{
return finishfromTitleScreen;
} }