diff --git a/Makefile b/Makefile index bdb92d3..05f15ad 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ clang : - clang src/Main.c -std=c99 -Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o Avoid + clang src/Main.c src/Title.c src/Credits.c src/Gameover.c src/Gameplay.c -std=c99 -Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o Avoid tcc : - tcc src/Main.c -std=c99 -Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o Avoid + tcc src/Main.c src/Title.c src/Credits.c src/Gameover.c src/Gameplay.c -std=c99 -Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o Avoid gcc : - gcc src/Main.c -std=c99 -Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o Avoid + gcc src/Main.c src/Title.c src/Credits.c src/Gameover.c src/Gameplay.c -std=c99 -Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o Avoid diff --git a/asset-src/gfx/health.piskel b/asset-src/gfx/health.piskel deleted file mode 100644 index 1969d70..0000000 --- a/asset-src/gfx/health.piskel +++ /dev/null @@ -1 +0,0 @@ -{"modelVersion":2,"piskel":{"name":"Health","description":"","fps":12,"height":40,"width":40,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAbUlEQVRYhe3WMQ7AIAhAUY/g8XtUNjvZuGAgjSjx/8QNwhsthYiIKLI2ed55becC4FPr9yzAcd6wcxlQOarOhQFFpIlIHuB4WIMBtAIAroJGwNIAXdAdsDTAKfQEWO94YG/5d+pvxwOJiIjI1wsK5HWucm45QwAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/asset-src/gfx/heart.piskel b/asset-src/gfx/heart.piskel new file mode 100644 index 0000000..7d4aa2f --- /dev/null +++ b/asset-src/gfx/heart.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"Health","description":"","fps":12,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAZ0lEQVRYhe3OQQ4AIQgDQJ/g830qNz3rbhZEyDamTXqkTCkMwzDPdKXpOxiAVutrDQOn9+CAjyHvnQ4QETzAOqg9vhewWxcgsgQQYAGkQHYewwBCICePYQAuSORjGMAEMTQtvwPuygADDK9XgRU+4gAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/assets/gfx/health.png b/assets/gfx/health.png index 78ae39c..4419837 100644 Binary files a/assets/gfx/health.png and b/assets/gfx/health.png differ diff --git a/build-html5.sh b/build-html5.sh index c028c48..6034220 100755 --- a/build-html5.sh +++ b/build-html5.sh @@ -1,2 +1,2 @@ #!/bin/sh -emcc -o html5/index.html src/Main.c -Os -Wall /usr/local/lib/libraylib.a -I. -I/usr/local/include/raylib.h -L. -L/usr/local/lib/libraylib.a -s USE_GLFW=3 -DPLATFORM_WEB --preload-file ./assets --shell-file html5/shell.html +emcc -o html5/index.html src/Main.c src/Title.c src/Credits.c src/Gameover.c src/Gameplay.c -Os -Wall /usr/local/lib/libraylib.a -I. -I/usr/local/include/raylib.h -L. -L/usr/local/lib/libraylib.a -s USE_GLFW=3 -DPLATFORM_WEB --preload-file ./assets --shell-file html5/shell.html diff --git a/src/Credits.c b/src/Credits.c new file mode 100644 index 0000000..7e37931 --- /dev/null +++ b/src/Credits.c @@ -0,0 +1,32 @@ +/* +- Avoid ~ a game by Canneddonuts +- Filename ~ Credits.c +- Author ~ Return0ne +- 2022 +- *no license* +*/ + +#include "../include/raylib.h" + +#include "Screens.h" +#include "Controls.h" + +void UpdateCreditsScreen(void) +{ + if (INPUT_OPTION_PRESSED) currentScreen = TITLE; +} + +void DrawCreditsScreen(void) +{ + DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), GREEN); + + DrawText("Avoid", 330, 20, 50, MAGENTA); + + DrawText("Programming and Art by Return0ne", 10, 210, 20, BLUE); + + DrawText("Powered by raylib 4.0", 10, 240, 20, BLUE); + + DrawText("A Canneddonuts project 2022", 10, 270, 40, RED); + + DrawText("Press 'ENTER' ", 10, 350, 20, WHITE); +} diff --git a/src/Gameover.c b/src/Gameover.c new file mode 100644 index 0000000..402404b --- /dev/null +++ b/src/Gameover.c @@ -0,0 +1,44 @@ +/* +- Avoid ~ a game by Canneddonuts +- Filename ~ Gameover.c +- Author ~ Return0ne +- 2022 +- *no license* +*/ + +#include "../include/raylib.h" + +#include "Screens.h" +#include "Controls.h" + +int gameoverSelected = 0; + +void InitGameoverScreen(void) +{ + gameoverSelected = 0; +} + +void UpdateGameoverScreen(void) +{ + if (INPUT_UP_PRESSED) gameoverSelected++; + if (INPUT_DOWN_PRESSED) gameoverSelected--; + if (gameoverSelected > 0) gameoverSelected--; + if (gameoverSelected < -1) gameoverSelected++; + + if ((gameoverSelected == 0) && (INPUT_OPTION_PRESSED)) + currentScreen = GAMEPLAY; + + if ((gameoverSelected == -1) && (INPUT_OPTION_PRESSED)) + currentScreen = TITLE; +} + +void DrawGameoverScreen(void) +{ + DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), BLUE); + DrawText("GAMEOVER", 250, 20, 50, RED); + if (gameoverSelected == 0) DrawText("RETRY", 350, 200, 20, WHITE); + else DrawText("RETRY", 350, 200, 20, RED); + + if (gameoverSelected == -1) DrawText("TITLE", 352, 230, 20, WHITE); + else DrawText("TITLE", 352, 230, 20, RED); +} diff --git a/src/Gameplay.c b/src/Gameplay.c new file mode 100644 index 0000000..784c79b --- /dev/null +++ b/src/Gameplay.c @@ -0,0 +1,219 @@ +/* +- Avoid ~ a game by Canneddonuts +- Filename ~ Gameplay.c +- Author ~ Return0ne +- 2022 +- *no license* +*/ + +#include "../include/raylib.h" + +#include "Screens.h" +#include "Controls.h" +#include "Gameplay.h" +#include "Score.h" + +int score = 0, bestscore = 0; + +void InitGameplayScreen(void) +{ + fxbounce = LoadSound("assets/sfx/boing.wav"); + + SetMasterVolume(0.2); + + player.sprite = LoadTexture("assets/gfx/player.png"); + player.currentframe = 0; + player.speed = 300.0f; + player.hp = 30; + player.frameRec = (Rectangle) { + player.hitbox.x, + player.hitbox.y, + (float) player.sprite.width/3, + (float) player.sprite.height + }; + player.hitbox = (Rectangle) { + GetScreenWidth()/2.0f - 30, + GetScreenHeight()/2.0f - 30, + (float) player.sprite.width/3, + (float) player.sprite.height + }; + + heart.sprite = LoadTexture("assets/gfx/health.png"); + heart.hitbox = (Rectangle) { + GetRandomValue(0, GetScreenWidth() - heart.sprite.width), + GetRandomValue(0, GetScreenHeight() - heart.sprite.height), + (float) heart.sprite.width, + (float) heart.sprite.height + }; + heart.active = false; + + ball.position = (Vector2){ 50, 50 }; + ball.speed = (Vector2){ 400.0f, 300.0f }; + ball.radius = 20; + ball.growth = 2; + ball.color = MAROON; + ball.active = true; + + pause = 0; + mute = 0; + DebugMode = 0; + pauseTimer = 0; +} + +void ResetGameplayScreen(void) +{ + // code to reset all variables without reloading assets + player.currentframe = 0; + player.speed = 300.0f; + player.hp = 30; + player.hitbox = (Rectangle) { + GetScreenWidth()/2.0f - 30, + GetScreenHeight()/2.0f - 30, + (float) player.sprite.width/3, + (float) player.sprite.height + }; + + heart.hitbox = (Rectangle) { + GetRandomValue(0, GetScreenWidth() - heart.sprite.width), + GetRandomValue(0, GetScreenHeight() - heart.sprite.height), + (float) heart.sprite.width, + (float) heart.sprite.height + }; + heart.active = false; + + ball.position = (Vector2){ 50, 50 }; + ball.radius = 20; + ball.active = true; + + DebugMode = 0; + + pauseTimer = 0; + score = 0; +} + +void UpdateGameplayScreen(void) +{ + if (IsKeyPressed(KEY_M)) mute = !mute; + + if (INPUT_OPTION_PRESSED) pause = !pause; + + if (!pause) { + // Controls + if (INPUT_LEFT_DOWN) player.hitbox.x -= GetFrameTime() * player.speed; + if (INPUT_RIGHT_DOWN) player.hitbox.x += GetFrameTime() * player.speed; + if (INPUT_UP_DOWN) player.hitbox.y -= GetFrameTime() * player.speed; + if (INPUT_DOWN_DOWN) player.hitbox.y += GetFrameTime() * player.speed; + if (INPUT_DASH_DOWN) { + player.speed = 600.0f; + if (player.currentframe != 1) player.currentframe = 2; + } else player.speed = 300.0f; + + + player.sprite_pos = (Vector2){ player.hitbox.x, player.hitbox.y }; + player.frameRec.x = (float)player.currentframe*(float)player.sprite.width/3; + + heart.sprite_pos = (Vector2){ heart.hitbox.x, heart.hitbox.y }; + + if (score == 1000) heart.active = true; + if (score == 2000) heart.active = true; + if (score == 3000) heart.active = true; + if (score == 4000) heart.active = true; + if (score == 5000) heart.active = true; + if (score == 6000) heart.active = true; + if (score == 7000) heart.active = true; + if (score == 8000) heart.active = true; + if (score == 9000) heart.active = true; + if (score == 10000) heart.active = true; + + // Player to da wallz collies + if ((player.hitbox.x + player.hitbox.width) >= GetScreenWidth()) player.hitbox.x = GetScreenWidth() - player.hitbox.width; + else if (player.hitbox.x <= 0) player.hitbox.x = 0; + + if ((player.hitbox.y + player.hitbox.height) >= GetScreenHeight()) player.hitbox.y = GetScreenHeight() - player.hitbox.height; + else if (player.hitbox.y <= 0) player.hitbox.y = 0; + + if (IsKeyPressed(KEY_B)) ball.active = !ball.active; + + if (IsKeyPressed(KEY_D)) DebugMode = !DebugMode; + + if (IsKeyPressed(KEY_R)) { + gameReset(); + currentScreen = TITLE; + } + + if (player.hp <= 0) { + gameReset(); + currentScreen = GAMEOVER; + } + + if (heart.active) { + if (CheckCollisionRecs(player.hitbox, heart.hitbox)) { + player.hp = 30; + heart.hitbox.x = GetRandomValue(0, GetScreenWidth() - heart.sprite.width); + heart.hitbox.y = GetRandomValue(0, GetScreenHeight() - heart.sprite.height); + heart.active = false; + } + } + + if (ball.active) { + score++; + // movement of the ball + ball.position.x += GetFrameTime() * ball.speed.x; + ball.position.y += GetFrameTime() * ball.speed.y; + + if (score >= bestscore) bestscore = score; + + // Ballz to da wallz collies + if ((ball.position.x >= (GetScreenWidth() - ball.radius)) || (ball.position.x <= ball.radius)) { + ball.speed.x *= -1.0f; + if (!mute) PlaySoundMulti(fxbounce); + } + + if ((ball.position.y >= (GetScreenHeight() - ball.radius)) || (ball.position.y <= ball.radius)) { + ball.speed.y *= -1.0f; + if (!mute) PlaySoundMulti(fxbounce); + } + + if (CheckCollisionCircleRec(ball.position, ball.radius, player.hitbox)) { + player.hp -= GetFrameTime() * 3.0f; + player.currentframe = 1; + } else player.currentframe = 0; + + if (ball.radius <= 100) ball.radius += GetFrameTime() * ball.growth; + } + + } + else pauseTimer++; +} + +void DrawGameplayScreen(void) +{ + DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), BLACK); + DrawFPS(10, 430); + DrawText(TextFormat("HP: %i", player.hp), 10, 10, 20, RED); + DrawText(TextFormat("SCORE: %i", score), 10, 30, 20, BLUE); + if (DebugMode) { + DrawText(TextFormat("BALL SIZE: %f", ball.radius), 10, 50, 20, GREEN); + DrawText(TextFormat("BALL POS X: %f, BALL POS Y: %f", ball.position.x, ball.position.y), 10, 70, 20, GREEN); + DrawText(TextFormat("BALL SPEED X: %f, BALL SPEED Y: %f", ball.speed.x, ball.speed.y), 10, 90, 20, GREEN); + DrawRectangleRec(player.hitbox, BLUE); + DrawRectangleRec(heart.hitbox, GREEN); + } + if (ball.active) DrawCircleV(ball.position, (float)ball.radius, ball.color); + if (heart.active) DrawTexture(heart.sprite, heart.sprite_pos.x, heart.sprite_pos.y, RAYWHITE); + DrawTextureRec(player.sprite, player.frameRec, player.sprite_pos, WHITE); + if (pause && ((pauseTimer/30)%2)) DrawText("PAUSED", 330, 190, 30, PURPLE); +} + +void UnloadGameplayScreen() +{ + UnloadSound(fxbounce); + UnloadTexture(player.sprite); + UnloadTexture(heart.sprite); +} + +void gameReset(void) +{ + ResetGameplayScreen(); + InitGameoverScreen(); +} diff --git a/src/Gameplay.h b/src/Gameplay.h new file mode 100644 index 0000000..f4b9041 --- /dev/null +++ b/src/Gameplay.h @@ -0,0 +1,47 @@ +/* +- Avoid ~ a game by Canneddonuts +- Filename ~ Gameplay.h +- Author ~ Return0ne +- 2022 +- *no license* +*/ + +#ifndef GAMEPLAY_HEADER +#define GAMEPLAY_HEADER + +typedef struct Ball { + Vector2 position; + Vector2 speed; + float radius; + float growth; + Color color; + bool active; +} Ball; + +typedef struct Player { + Texture2D sprite; + float speed; + int hp; + int currentframe; + Vector2 sprite_pos; + Rectangle frameRec; + Rectangle hitbox; +} Player; + +typedef struct Item { + Texture2D sprite; + Vector2 sprite_pos; + Rectangle hitbox; + bool active; +} Item; + +int pauseTimer; +Sound fxbounce = { 0 }; +Player player = { 0 }; +Ball ball = { 0 }; +Item heart = { 0 }; +bool pause; +bool mute; +bool DebugMode; + +#endif diff --git a/src/Main.c b/src/Main.c index b1bc848..a1e9610 100644 --- a/src/Main.c +++ b/src/Main.c @@ -8,8 +8,10 @@ #include "../include/raylib.h" +#include "Screens.h" #include "Controls.h" + #if defined(PLATFORM_WEB) #include #endif @@ -18,54 +20,13 @@ static const int screenWidth = 800; static const int screenHeight = 450; -// Gamescreens -typedef enum GameScreen { TITLE = 0, GAMEPLAY, GAMEOVER, CREDITS } GameScreen; +GameScreen currentScreen = 0; -// structs -typedef struct Ball { - Vector2 position; - Vector2 speed; - float radius; - float growth; - Color color; - bool active; -} Ball; - -typedef struct Player { - Texture2D sprite; - float speed; - int hp; - int currentframe; - Vector2 sprite_pos; - Rectangle frameRec; - Rectangle hitbox; -} Player; -/* -typedef struct Item { - Texture2D sprite; - Vector2 sprite_pos; - Rectangle hitbox; - bool active; -} Item; -*/ -// Game variables -static int pauseTimer; -static int score, bestscore; -static int titleSelected = 0, gameoverSelected = 0; -static GameScreen currentScreen = { 0 }; -static Sound fxbounce = { 0 }; -static Player player = { 0 }; -static Ball ball = { 0 }; -// static Item heart = { 0 }; -static bool pause; -static bool mute; -static bool DebugMode; // Game functions static void gameSetup(void); static void updateGame(void); static void drawGame(void); -static void gameReset(void); static void gameLoop(void); static void unloadGame(void); @@ -99,48 +60,7 @@ void gameSetup(void) // asset loading & setting of variable values currentScreen = TITLE; - fxbounce = LoadSound("assets/sfx/boing.wav"); - - SetMasterVolume(0.2); - - player.sprite = LoadTexture("assets/gfx/player.png"); - player.currentframe = 0; - player.speed = 300.0f; - player.hp = 30; - player.frameRec = (Rectangle) { - player.hitbox.x, - player.hitbox.y, - (float) player.sprite.width/3, - (float) player.sprite.height - }; - player.hitbox = (Rectangle) { - GetScreenWidth()/2.0f - 30, - GetScreenHeight()/2.0f - 30, - (float) player.sprite.width/3, - (float) player.sprite.height - }; -/* - heart.sprite = LoadTexture("assets/gfx/health.png"); - heart.hitbox = (Rectangle) { - GetRandomValue(0, screenWidth - heart.sprite.width), - GetRandomValue(0, screenHeight - heart.sprite.height), - (float) heart.sprite.width/3, - (float) heart.sprite.height - }; - heart.active = true; -*/ - ball.position = (Vector2){ 50, 50 }; - ball.speed = (Vector2){ 400.0f, 300.0f }; - ball.radius = 20; - ball.growth = 2; - ball.color = MAROON; - ball.active = true; - - pause = 0; - mute = 0; - DebugMode = 0; - pauseTimer = 0; - score = 0; + InitGameplayScreen(); } void updateGame(void) @@ -149,107 +69,11 @@ void updateGame(void) if ((IsKeyDown(KEY_LEFT_ALT)) && (IsKeyPressed(KEY_F))) ToggleFullscreen(); switch(currentScreen) { - case TITLE: - if (INPUT_UP_PRESSED) titleSelected++; - if (INPUT_DOWN_PRESSED) titleSelected--; - 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/"); - break; - case GAMEPLAY: - - if (IsKeyPressed(KEY_M)) mute = !mute; - - if (INPUT_OPTION_PRESSED) pause = !pause; - - if (!pause) { - // Controls - if (INPUT_LEFT_DOWN) player.hitbox.x -= GetFrameTime() * player.speed; - if (INPUT_RIGHT_DOWN) player.hitbox.x += GetFrameTime() * player.speed; - if (INPUT_UP_DOWN) player.hitbox.y -= GetFrameTime() * player.speed; - if (INPUT_DOWN_DOWN) player.hitbox.y += GetFrameTime() * player.speed; - if (INPUT_DASH_DOWN) { - player.speed = 600.0f; - if (player.currentframe != 1) player.currentframe = 2; - } else player.speed = 300.0f; - - - player.sprite_pos = (Vector2){ player.hitbox.x, player.hitbox.y }; - player.frameRec.x = (float)player.currentframe*(float)player.sprite.width/3; - - // heart.sprite_pos = (Vector2){ heart.hitbox.x, heart.hitbox.y }; - - // Player to da wallz collies - if ((player.hitbox.x + player.hitbox.width) >= GetScreenWidth()) player.hitbox.x = GetScreenWidth() - player.hitbox.width; - else if (player.hitbox.x <= 0) player.hitbox.x = 0; - - if ((player.hitbox.y + player.hitbox.height) >= GetScreenHeight()) player.hitbox.y = GetScreenHeight() - player.hitbox.height; - else if (player.hitbox.y <= 0) player.hitbox.y = 0; - - if (IsKeyPressed(KEY_B)) ball.active = !ball.active; - - if (IsKeyPressed(KEY_D)) DebugMode = !DebugMode; - - if (IsKeyPressed(KEY_R)) { - gameReset(); - currentScreen = TITLE; - } - - if (player.hp <= 0) { - gameReset(); - currentScreen = GAMEOVER; - } - - - if (ball.active) { - score++; - // movement of the ball - ball.position.x += GetFrameTime() * ball.speed.x; - ball.position.y += GetFrameTime() * ball.speed.y; - - if (score >= bestscore) bestscore = score; - - // Ballz to da wallz collies - if ((ball.position.x >= (GetScreenWidth() - ball.radius)) || (ball.position.x <= ball.radius)) { - ball.speed.x *= -1.0f; - if (!mute) PlaySoundMulti(fxbounce); - } - - if ((ball.position.y >= (GetScreenHeight() - ball.radius)) || (ball.position.y <= ball.radius)) { - ball.speed.y *= -1.0f; - if (!mute) PlaySoundMulti(fxbounce); - } - - if (CheckCollisionCircleRec(ball.position, ball.radius, player.hitbox)) { - player.hp -= GetFrameTime() * 3.0f; - player.currentframe = 1; - } else player.currentframe = 0; - - if (ball.radius <= 100) ball.radius += GetFrameTime() * ball.growth; - } - - } - else pauseTimer++; - - break; - case GAMEOVER: - if (INPUT_UP_PRESSED) gameoverSelected++; - if (INPUT_DOWN_PRESSED) gameoverSelected--; - if (gameoverSelected > 0) gameoverSelected--; - if (gameoverSelected < -1) gameoverSelected++; - - if ((gameoverSelected == 0) && (INPUT_OPTION_PRESSED)) - currentScreen = GAMEPLAY; - - if ((gameoverSelected == -1) && (INPUT_OPTION_PRESSED)) - currentScreen = TITLE; - break; - case CREDITS: - if (INPUT_OPTION_PRESSED) currentScreen = TITLE; - default: break; + case TITLE: UpdateTitleScreen(); break; + case GAMEPLAY: UpdateGameplayScreen(); break; + case GAMEOVER: UpdateGameoverScreen(); break; + case CREDITS: UpdateCreditsScreen(); break; + default: break; } } @@ -261,102 +85,16 @@ void drawGame(void) ClearBackground(RAYWHITE); switch(currentScreen) { - case TITLE: - DrawRectangle(0, 0, screenWidth, screenHeight, ORANGE); - DrawText("Controls", 10, 10, 30, PURPLE); - DrawText(TextFormat("BEST: %i", bestscore), 600, 0, 30, WHITE); - DrawText("Press the arrow keys or 'DPAD' to move and 'X' to dash", 10, 40, 10, RED); - DrawText("Press 'ENTER' or 'START' to pause", 10, 60, 10, RED); - DrawText("Press 'M' to mute", 10, 80, 10, RED); - DrawText("Press 'Left-ALT' + 'F' for full screen", 10, 100, 10, RED); - DrawText("Press 'R' to restart", 10, 120, 10, RED); - DrawText("Press 'ENTER' or 'START' to select an option", 10, 140, 10, RED); - DrawText("Avoid", 330, 20, 50, 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 == -2) DrawText("MORE GAMES", 320, 260, 20, WHITE); - else DrawText("MORE GAMES", 320, 260, 20, BLUE); - break; - - case GAMEPLAY: - DrawRectangle(0, 0, screenWidth, screenHeight, BLACK); - DrawFPS(10, 430); - DrawText(TextFormat("HP: %i", player.hp), 10, 10, 20, RED); - DrawText(TextFormat("SCORE: %i", score), 10, 30, 20, BLUE); - if (DebugMode) { - DrawText(TextFormat("BALL SIZE: %f", ball.radius), 10, 50, 20, GREEN); - DrawText(TextFormat("BALL POS X: %f, BALL POS Y: %f", ball.position.x, ball.position.y), 10, 70, 20, GREEN); - DrawText(TextFormat("BALL SPEED X: %f, BALL SPEED Y: %f", ball.speed.x, ball.speed.y), 10, 90, 20, GREEN); - DrawRectangleRec(player.hitbox, BLUE); - } - if (ball.active) DrawCircleV(ball.position, (float)ball.radius, ball.color); - // if (heart.active) DrawTexture(heart.sprite, heart.sprite_pos.x, heart.sprite_pos.y, RAYWHITE); - DrawTextureRec(player.sprite, player.frameRec, player.sprite_pos, WHITE); - if (pause && ((pauseTimer/30)%2)) DrawText("PAUSED", 330, 190, 30, PURPLE); - break; - - case GAMEOVER: - DrawRectangle(0, 0, screenWidth, screenHeight, BLUE); - DrawText("GAMEOVER", 250, 20, 50, RED); - if (gameoverSelected == 0) DrawText("RETRY", 350, 200, 20, WHITE); - else DrawText("RETRY", 350, 200, 20, RED); - - if (gameoverSelected == -1) DrawText("TITLE", 352, 230, 20, WHITE); - else DrawText("TITLE", 352, 230, 20, RED); - break; - - case CREDITS: - DrawRectangle(0, 0, screenWidth, screenHeight, GREEN); - DrawText("Avoid", 330, 20, 50, MAGENTA); - DrawText("Programming and Art by Return0ne", 10, 210, 20, BLUE); - DrawText("Powered by raylib 4.0", 10, 240, 20, BLUE); - DrawText("A Canneddonuts project 2022", 10, 270, 40, RED); - DrawText("Press 'ENTER' ", 10, 350, 20, WHITE); - break; - + case TITLE: DrawTitleScreen(); break; + case GAMEPLAY: DrawGameplayScreen(); break; + case GAMEOVER: DrawGameoverScreen(); break; + case CREDITS: DrawCreditsScreen(); break; default: break; } EndDrawing(); } -void gameReset(void) -{ - // code to reset all variables without reloading assets - player.currentframe = 0; - player.speed = 300.0f; - player.hp = 30; - player.hitbox = (Rectangle) { - GetScreenWidth()/2.0f - 30, - GetScreenHeight()/2.0f - 30, - (float) player.sprite.width/3, - (float) player.sprite.height - }; -/* - heart.hitbox = (Rectangle) { - GetRandomValue(0, screenWidth - heart.sprite.width), - GetRandomValue(0, screenHeight - heart.sprite.height), - (float) heart.sprite.width/3, - (float) heart.sprite.height - }; - heart.active = true; -*/ - ball.position = (Vector2){ 50, 50 }; - ball.radius = 20; - ball.active = true; - - DebugMode = 0; - - pauseTimer = 0; - score = 0; - - gameoverSelected = 0; -} - void gameLoop(void) { updateGame(); @@ -365,7 +103,5 @@ void gameLoop(void) void unloadGame(void) { - UnloadSound(fxbounce); - UnloadTexture(player.sprite); - //UnloadTexture(heart.sprite); + UnloadGameplayScreen(); } diff --git a/src/Score.h b/src/Score.h new file mode 100644 index 0000000..25c80d2 --- /dev/null +++ b/src/Score.h @@ -0,0 +1,15 @@ +/* +- Avoid ~ a game by Canneddonuts +- Filename ~ Score.h +- Author ~ Return0ne +- 2022 +- *no license* +*/ + +#ifndef SCORE_HEADER +#define SCORE_HEADER + +extern int bestscore; +extern int score; + +#endif diff --git a/src/Screens.h b/src/Screens.h new file mode 100644 index 0000000..a8570eb --- /dev/null +++ b/src/Screens.h @@ -0,0 +1,36 @@ +/* +- Avoid ~ a game by Canneddonuts +- Filename ~ Screens.h +- Author ~ Return0ne +- 2022 +- *no license* +*/ + +#ifndef SCREENS_HEADER +#define SCREENS_HEADER + +typedef enum GameScreen { TITLE = 0, GAMEPLAY, GAMEOVER, CREDITS } GameScreen; + +extern GameScreen currentScreen; + +void gameReset(void); + +void UpdateTitleScreen(void); +void DrawTitleScreen(void); + + +void InitGameplayScreen(void); +void UpdateGameplayScreen(void); +void DrawGameplayScreen(void); +void UnloadGameplayScreen(void); +void ResetGameplayScreen(void); + +void UpdateCreditsScreen(void); +void DrawCreditsScreen(void); + +void InitGameoverScreen(void); +void UpdateGameoverScreen(void); +void DrawGameoverScreen(void); + + +#endif diff --git a/src/Title.c b/src/Title.c new file mode 100644 index 0000000..abbcbe3 --- /dev/null +++ b/src/Title.c @@ -0,0 +1,49 @@ +/* +- Avoid ~ a game by Canneddonuts +- Filename ~ Title.h +- Author ~ Return0ne +- 2022 +- *no license* +*/ + +#include "../include/raylib.h" + +#include "Screens.h" +#include "Controls.h" +#include "Score.h" + +int titleSelected = 0; + +void UpdateTitleScreen(void) +{ + if (INPUT_UP_PRESSED) titleSelected++; + if (INPUT_DOWN_PRESSED) titleSelected--; + 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/"); +} + +void DrawTitleScreen(void) +{ + DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), ORANGE); + DrawText("Controls", 10, 10, 30, PURPLE); + DrawText(TextFormat("BEST: %i", bestscore), 600, 0, 30, WHITE); + DrawText("Press the arrow keys or 'DPAD' to move and 'X' to dash", 10, 40, 10, RED); + DrawText("Press 'ENTER' or 'START' to pause", 10, 60, 10, RED); + DrawText("Press 'M' to mute", 10, 80, 10, RED); + DrawText("Press 'Left-ALT' + 'F' for full screen", 10, 100, 10, RED); + DrawText("Press 'R' to restart", 10, 120, 10, RED); + DrawText("Press 'ENTER' or 'START' to select an option", 10, 140, 10, RED); + DrawText("Avoid", 330, 20, 50, 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 == -2) DrawText("MORE GAMES", 320, 260, 20, WHITE); + else DrawText("MORE GAMES", 320, 260, 20, BLUE); +}