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)/Title.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
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
- a build guide
- multiple stages
- an options menu
- 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
![Alt Text](./doc-assets/preview.png)

View file

@ -12,9 +12,16 @@
#include "Controls.h"
#include "Textures.h"
int finishfromCreditsScreen = 0;
void InitCreditsScreen(void)
{
finishfromCreditsScreen = 0;
}
void UpdateCreditsScreen(void)
{
if (INPUT_OPTION_PRESSED) currentScreen = TITLE;
if (INPUT_OPTION_PRESSED) finishfromCreditsScreen = 1;
}
void DrawCreditsScreen(void)
@ -27,3 +34,13 @@ void DrawCreditsScreen(void)
DrawText(TextFormat("Build compiled on %s", __DATE__), 10, 310, 30, GREEN);
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 "Controls.h"
int gameoverSelected = 0;
int gameoverSelected = 0, finishfromGameoverScreen = 0;
void InitGameoverScreen(void)
{
gameoverSelected = 0;
finishfromGameoverScreen = 0;
}
void UpdateGameoverScreen(void)
@ -26,10 +27,10 @@ void UpdateGameoverScreen(void)
if (gameoverSelected < -1) gameoverSelected++;
if ((gameoverSelected == 0) && (INPUT_OPTION_PRESSED))
currentScreen = GAMEPLAY;
finishfromGameoverScreen = 2;
if ((gameoverSelected == -1) && (INPUT_OPTION_PRESSED))
currentScreen = TITLE;
finishfromGameoverScreen = 1;
}
void DrawGameoverScreen(void)
@ -42,3 +43,13 @@ void DrawGameoverScreen(void)
if (gameoverSelected == -1) DrawText("TITLE", 352, 230, 20, WHITE);
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 "Controls.h"
#include "Options.h"
#include "Gameplay.h"
#include "Score.h"
#include "Timers.h"
#include "Textures.h"
int score = 0, bestscore = 0;
int score = 0, bestscore = 0, finishfromGameplayScreen = 0;
void LoadGamplayScreen(void)
{
@ -31,6 +32,8 @@ void LoadGamplayScreen(void)
void InitGameplayScreen(void)
{
finishfromGameplayScreen = 0;
SetMasterVolume(0.5);
player.currentframe = 0;
@ -155,8 +158,6 @@ void UpdateiFrameTimer(void)
void UpdateGameplayScreen(void)
{
if (IsKeyPressed(KEY_M)) mute = !mute;
if (INPUT_OPTION_PRESSED) pause = !pause;
if (!pause) {
@ -220,13 +221,11 @@ void UpdateGameplayScreen(void)
if (IsKeyPressed(KEY_R)) {
gameReset();
currentScreen = TITLE;
finishfromGameplayScreen = 2;
}
if (player.hp <= 0) {
gameReset();
currentScreen = GAMEOVER;
finishfromGameplayScreen = 1;
}
for (int i = 0; i < MAX_SHOOTS; i++) {
@ -357,8 +356,7 @@ void UnloadGameplayScreen()
UnloadTexture(attack_sprite);
}
void gameReset(void)
int FinishGameplayScreen(void)
{
InitGameplayScreen();
InitGameoverScreen();
return finishfromGameplayScreen;
}

View file

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

View file

@ -9,6 +9,7 @@
#include "../include/raylib.h"
#include "Screens.h"
#include "Options.h"
#if defined(PLATFORM_WEB)
#include <emscripten/emscripten.h>
@ -18,6 +19,12 @@
static const int screenWidth = 800;
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;
Texture2D background;
@ -29,10 +36,11 @@ Texture2D attack_sprite;
// Game functions
static void gameSetup(void);
static void updateGame(void);
static void drawGame(void);
static void gameLoop(void);
static void update_draw_frame(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)
{
@ -43,11 +51,11 @@ int main(void)
gameSetup();
#if defined(PLATFORM_WEB)
emscripten_set_main_loop(gameLoop, 60, 1);
emscripten_set_main_loop(update_draw_frame, 60, 1);
#else
SetTargetFPS(60);
while (!WindowShouldClose()) gameLoop();
while (!WindowShouldClose()) update_draw_frame();
#endif
unloadGame();
@ -63,52 +71,134 @@ void gameSetup(void)
{
// asset loading & setting of variable values
currentScreen = TITLE;
LoadGamplayScreen();
InitGameplayScreen();
InitTitleScreen();
background = LoadTexture("assets/gfx/background.png");
}
void updateGame(void)
{
// code that runs as long as the program is running
if ((IsKeyDown(KEY_LEFT_ALT)) && (IsKeyPressed(KEY_F))) ToggleFullscreen();
switch (currentScreen) {
case TITLE: UpdateTitleScreen(); break;
case GAMEPLAY: UpdateGameplayScreen(); break;
case GAMEOVER: UpdateGameoverScreen(); break;
case CREDITS: UpdateCreditsScreen(); break;
default: break;
static void transition_to_screen(int screen)
{
onTransition = true;
transFadeOut = false;
transFromScreen = currentScreen;
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();
ClearBackground(RAYWHITE);
ClearBackground(RAYWHITE);
switch (currentScreen) {
case TITLE: DrawTitleScreen(); break;
case GAMEPLAY: DrawGameplayScreen(); break;
case GAMEOVER: DrawGameoverScreen(); break;
case CREDITS: DrawCreditsScreen(); break;
default: break;
}
switch (currentScreen) {
case TITLE: DrawTitleScreen(); break;
case CREDITS: DrawCreditsScreen(); break;
case GAMEPLAY: DrawGameplayScreen(); break;
case GAMEOVER: DrawGameoverScreen(); break;
case OPTIONS: DrawOptionsScreen(); break;
default: break;
}
if (onTransition) draw_transition();
EndDrawing();
}
void gameLoop(void)
static void unloadGame(void)
{
updateGame();
drawGame();
}
void unloadGame(void)
{
UnloadGameplayScreen();
UnloadTitleScreen();
switch (currentScreen) {
case TITLE: UnloadTitleScreen(); break;
case GAMEPLAY: UnloadGameplayScreen(); break;
case GAMEOVER: UnloadGameoverScreen(); break;
case CREDITS: UnloadCreditsScreen(); break;
case OPTIONS: UnloadOptionsScreen(); break;
default: break;
}
}

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
#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;
void gameReset(void);
void InitTitleScreen(void);
void UpdateTitleScreen(void);
void DrawTitleScreen(void);
void UnloadTitleScreen(void);
int FinishTitleScreen(void);
void InitGameplayScreen(void);
void UpdateGameplayScreen(void);
void DrawGameplayScreen(void);
void UnloadGameplayScreen(void);
void LoadGamplayScreen(void);
int FinishGameplayScreen(void);
void InitCreditsScreen(void);
void UpdateCreditsScreen(void);
void DrawCreditsScreen(void);
void UnloadCreditsScreen(void);
int FinishCreditsScreen(void);
void InitGameoverScreen(void);
void UpdateGameoverScreen(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

View file

@ -1,6 +1,6 @@
/*
- Avoid ~ a game by Canneddonuts
- Filename ~ Title.h
- Filename ~ Title.c
- Author ~ Return0ne
- 2022
- *no license*
@ -13,7 +13,7 @@
#include "Score.h"
#include "Textures.h"
int titleSelected = 0;
int titleSelected = 0, finishfromTitleScreen = 0;
void DrawScore(void)
{
@ -27,9 +27,10 @@ void DrawScore(void)
DrawText(TextFormat("BEST: %i", bestscore), 600, 0, 30, BLUE);
}
void InitTitleScreen(void)
{
background = LoadTexture("assets/gfx/background.png");
finishfromTitleScreen = 0;
}
void UpdateTitleScreen(void)
@ -39,36 +40,41 @@ void UpdateTitleScreen(void)
if (titleSelected > 0) titleSelected--;
if (titleSelected < -2) titleSelected++;
if ((titleSelected == 0) && (INPUT_OPTION_PRESSED)) currentScreen = GAMEPLAY;
if ((titleSelected == -1) && (INPUT_OPTION_PRESSED)) currentScreen = CREDITS;
if ((titleSelected == -2) && (INPUT_OPTION_PRESSED)) OpenURL("https://canneddonuts.itch.io/");
if ((titleSelected == 0) && (INPUT_OPTION_PRESSED)) finishfromTitleScreen = 2;
if ((titleSelected == -1) && (INPUT_OPTION_PRESSED)) finishfromTitleScreen = 1;
if ((titleSelected == -2) && (INPUT_OPTION_PRESSED)) finishfromTitleScreen = 3;
}
void DrawTitleScreen(void)
{
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("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);
if (titleSelected == 0) DrawText("PLAY", 360, 220, 20, WHITE);
else DrawText("PLAY", 360, 220, 20, BLUE);
if (titleSelected == 0) DrawText("PLAY", 360, 220, 20, WHITE);
else DrawText("PLAY", 360, 220, 20, BLUE);
if (titleSelected == -1) DrawText("CREDITS", 340, 240, 20, WHITE);
else DrawText("CREDITS", 340, 240, 20, BLUE);
if (titleSelected == -1) DrawText("CREDITS", 340, 240, 20, WHITE);
else DrawText("CREDITS", 340, 240, 20, BLUE);
if (titleSelected == -2) DrawText("MORE GAMES", 320, 260, 20, WHITE);
else DrawText("MORE GAMES", 320, 260, 20, BLUE);
if (titleSelected == -2) DrawText("OPTIONS", 340, 260, 20, WHITE);
else DrawText("OPTIONS", 340, 260, 20, BLUE);
}
void UnloadTitleScreen(void)
{
UnloadTexture(background);
}
int FinishTitleScreen(void)
{
return finishfromTitleScreen;
}