commit 32ef84bd032c3f41690b1e9b10063e19d1a70fe0 Author: Mark B Date: Sun Mar 27 16:40:15 2022 -0400 first commit lol diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cabf7c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +Avoid diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bdb92d3 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +clang : + clang src/Main.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 + +gcc : + gcc src/Main.c -std=c99 -Wall -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -o Avoid diff --git a/assets/bgm/01-Slipin-Sunday.ogg b/assets/bgm/01-Slipin-Sunday.ogg new file mode 100644 index 0000000..83298f1 Binary files /dev/null and b/assets/bgm/01-Slipin-Sunday.ogg differ diff --git a/assets/sfx/boing.wav b/assets/sfx/boing.wav new file mode 100644 index 0000000..b07fc96 Binary files /dev/null and b/assets/sfx/boing.wav differ diff --git a/src/Main.c b/src/Main.c new file mode 100644 index 0000000..ca2730f --- /dev/null +++ b/src/Main.c @@ -0,0 +1,252 @@ +// #include +#include "raylib.h" + +// screen variables +static const int screenWidth = 800; +static const int screenHeight = 450; + +// Gamescreens +typedef enum GameScreen { TITLE = 0, GAMEPLAY, GAMEOVER, CREDITS } GameScreen; + +// structs +typedef struct Ball { + Vector2 position; + Vector2 speed; + float radius; + //float growth; + Color color; + bool active; +} Ball; + +typedef struct Player { + Rectangle hitbox; + int hp; +} Player; + +// Game variables +static int Exit_num = 0; +static GameScreen currentScreen = { 0 }; +static Music Bgm01 = { 0 }; +static Sound fxbounce = { 0 }; +static Player player = { 0 }; +static Ball ball = { 0 }; +static bool pause; +static bool mute; +static int pauseTimer; +static int BallFrameCounter; +static int selected = 0; + +// Game functions +static void GameInit(void); +static void UpdateGame(void); +static void DrawGame(void); +static void UpdateDrawFrame(void); +static void UnloadGame(void); + +int main(void) +{ + InitWindow(screenWidth, screenHeight, "Avoid"); + + InitAudioDevice(); + + GameInit(); + + while (!WindowShouldClose()) UpdateDrawFrame(); + + UnloadGame(); + + CloseWindow(); + + return Exit_num; +} + +void GameInit(void) +{ + SetTargetFPS(60); + + currentScreen = TITLE; + + Bgm01 = LoadMusicStream("assets/bgm/01-Slipin-Sunday.ogg"); + + fxbounce = LoadSound("assets/sfx/boing.wav"); + + + PlayMusicStream(Bgm01); + SetMasterVolume(0.2); + + player.hp = 30; + player.hitbox = (Rectangle) { + GetScreenWidth()/2.0f - 30, + GetScreenHeight()/2.0f - 30, + 50, + 50 + }; + + ball.position = (Vector2){ 50, 50 }; + ball.radius = 20; + //ball.growth = 0.1; + ball.speed = (Vector2){ 400.0f, 400.0f }; + ball.color = MAROON; + ball.active = true; + + pause = 0; + mute = 0; + + pauseTimer = 0; + BallFrameCounter = 0; +} + +void UpdateGame(void) +{ + if ((IsKeyDown(KEY_LEFT_SHIFT)) && (IsKeyPressed(KEY_F))) ToggleFullscreen(); + + switch(currentScreen) { + case TITLE: + if (IsKeyPressed(KEY_UP)) selected++; + if (IsKeyPressed(KEY_DOWN)) selected--; + if (selected > 0) selected--; + if (selected < -1) selected++; + + if ((selected == 0) && (IsKeyPressed(KEY_ENTER))) currentScreen = GAMEPLAY; + if ((selected == -1) && (IsKeyPressed(KEY_ENTER))) currentScreen = CREDITS; + break; + case GAMEPLAY: + UpdateMusicStream(Bgm01); + + if (IsKeyPressed(KEY_M)) { + mute = !mute; + + if (mute) PauseMusicStream(Bgm01); + else ResumeMusicStream(Bgm01); + } + + if (IsKeyPressed(KEY_SPACE)) pause = !pause; + + if (!pause) { + // Controls + if (IsKeyDown(KEY_LEFT)) player.hitbox.x -= GetFrameTime() * 300.0f; + if (IsKeyDown(KEY_RIGHT)) player.hitbox.x += GetFrameTime() * 300.0f; + if (IsKeyDown(KEY_UP)) player.hitbox.y -= GetFrameTime() * 300.0f; + if (IsKeyDown(KEY_DOWN)) player.hitbox.y += GetFrameTime() * 300.0f; + + // 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_D)) ball.active = !ball.active; + if (IsKeyPressed(KEY_R)) { GameInit(); currentScreen = TITLE; } + if (ball.active) { + BallFrameCounter++; + // moveiement oof the balls + ball.position.x += GetFrameTime() * ball.speed.x; + ball.position.y += GetFrameTime() * ball.speed.y; + + // ball.radius += GetFrameTime() * ball.growth; + + + // 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 (ball.position.x >= screenWidth) ball.position.x = 100; + // if (ball.position.y >= screenHeight) ball.position.y = 100; + + + if (CheckCollisionCircleRec(ball.position, ball.radius, player.hitbox)) player.hp--; + + if (BallFrameCounter==1000) ball.radius = 40; + if (BallFrameCounter==2000) ball.radius = 50; + if (BallFrameCounter==3000) ball.radius = 60; + if (BallFrameCounter==4000) ball.radius = 70; + } + + if (player.hp <= 0) currentScreen = GAMEOVER; + + } + else pauseTimer++; + + break; + case GAMEOVER: + if (IsKeyPressed(KEY_ENTER)) { + GameInit(); + currentScreen = GAMEPLAY; + } + break; + case CREDITS: + if (IsKeyPressed(KEY_ENTER)) currentScreen = TITLE; + default: break; + } +} + +void DrawGame(void) +{ + BeginDrawing(); + + ClearBackground(RAYWHITE); + + switch(currentScreen) { + case TITLE: + DrawRectangle(0, 0, screenWidth, screenHeight, ORANGE); + DrawText("Controls", 10, 10, 30, PURPLE); + DrawText("Press the arrow keys to move", 10, 40, 10, RED); + DrawText("Press 'SPACE' to pause", 10, 60, 10, RED); + DrawText("Press 'M' to mute", 10, 80, 10, RED); + DrawText("Press 'LSHIFT' + 'F' for full screen", 10, 100, 10, RED); + DrawText("Press 'R' to restart", 10, 120, 10, RED); + DrawText("Press 'ENTER' to select an option", 10, 140, 10, RED); + DrawText("Avoid", 330, 20, 50, BLUE); + if (selected == 0) DrawText("PLAY", 360, 220, 20, WHITE); + else DrawText("PLAY", 360, 220, 20, BLUE); + + if (selected == -1) DrawText("CREDITS", 340, 240, 20, WHITE); + else DrawText("CREDITS", 340, 240, 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("BALL FRAMES: %i", BallFrameCounter), 10, 30, 20, BLUE); + DrawText(TextFormat("BALL SIZE: %f", ball.radius), 10, 50, 20, PINK); + if (ball.active) DrawCircleV(ball.position, (float)ball.radius, ball.color); + DrawRectangleRec(player.hitbox, BLUE); + 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); + DrawText("PRESS ENTER TO RESET", 270, 220, 20, WHITE); + break; + + case CREDITS: + DrawRectangle(0, 0, screenWidth, screenHeight, GREEN); + DrawText("Avoid", 330, 20, 50, RED); + DrawText("Programming by M-C-O-B", 10, 210, 20, BLUE); + DrawText("Morale support by Tobi/Tobrella and Jelly_man", 10, 240, 20, BLUE); + DrawText("Powered by raylib 4.0", 10, 270, 20, BLUE); + DrawText("A Canneddonuts project 2022", 10, 310, 40, MAROON); + DrawText("Press 'ENTER' ", 10, 350, 20, WHITE); + break; + + default: break; + } + + EndDrawing(); +} + + +void UpdateDrawFrame(void) +{ + UpdateGame(); + DrawGame(); +} + +void UnloadGame(void) +{ + UnloadMusicStream(Bgm01); + UnloadSound(fxbounce); +}