diff --git a/bin/assets/images/Unbenannt.png b/bin/assets/images/Unbenannt.png new file mode 100644 index 0000000..a5aa3e8 Binary files /dev/null and b/bin/assets/images/Unbenannt.png differ diff --git a/bin/assets/sounds/menu_music (2).wav b/bin/assets/sounds/menu_music.wav similarity index 100% rename from bin/assets/sounds/menu_music (2).wav rename to bin/assets/sounds/menu_music.wav diff --git a/breakout.c b/breakout.c index 2d3efee..fbd9b94 100644 --- a/breakout.c +++ b/breakout.c @@ -22,6 +22,7 @@ extern int width, height; #define BREAKOUT_CountdownTexturePath "assets/images/text.png" #define BREAKOUT_PausedTexturePath "assets/images/paused.png" #define BREAKOUT_DeathSoundPath "assets/sounds/death.wav" +#define BREAKOUT_IngameSoundPath "assets/sounds/ingame_music.wav" #define BALL_MinSpeed 8.0f #define BALL_MaxSpeed 25.0f #define BALL_AccelerationTime 10000 @@ -31,6 +32,7 @@ extern int width, height; #define BREAKOUT_LiveHUDSize 35 #define BREAKOUT_LiveHUDMargin 8 #define BREAKOUT_PushIntervale 1800 +#define BREAKOUT_FadeTime 1000 #ifndef __nullptr__ #define Nullptr(type) (type *)0 @@ -57,7 +59,8 @@ bool BREAKOUT_IsInit = false; bool BALL_IsInit = false; bool PADDLE_IsInit = false; bool BLOCK_IsInit = false; -Mix_Chunk * deathSound; +Mix_Chunk * BREAKOUT_DeathSound; +Mix_Music * BREAKOUT_IngameMusic; void BREAKOUT_INITIALIZE(SDL_Renderer * renderer){ if (!BREAKOUT_IsInit) { @@ -77,12 +80,29 @@ void BREAKOUT_INITIALIZE(SDL_Renderer * renderer){ BREAKOUT_CountdownSourceRects[1] = (SDL_Rect) {.x = 1, .y = 1, .w = 242, .h = 665 }; BREAKOUT_CountdownSourceRects[2] = (SDL_Rect) {.x = 245, .y = 1, .w = 443, .h = 665 }; BREAKOUT_CountdownSourceRects[3] = (SDL_Rect) {.x = 690, .y = 1, .w = 443, .h = 665 }; - deathSound = Mix_LoadWAV(BREAKOUT_DeathSoundPath); + BREAKOUT_DeathSound = Mix_LoadWAV(BREAKOUT_DeathSoundPath); + BREAKOUT_IngameMusic = Mix_LoadMUS(BREAKOUT_IngameSoundPath); printf("Game initialized!\n"); BREAKOUT_IsInit = true; } else printf("Game is already initialized!\n"); } /* BREAKOUT_INITIALIZE */ +void BREAKOUT_StartMusic(){ + printf("Attempting to start game music...\n"); + if (!Mix_PlayingMusic()) + Mix_FadeInMusic(BREAKOUT_IngameMusic, -1, BREAKOUT_FadeTime); + else printf("Game music is already playing!\n"); +} + +void BREAKOUT_PauseMusic(){ + printf("Attempting to pause game music...\n"); + if (Mix_PlayingMusic()) + Mix_HaltMusic(); + // Mix_FadeOutMusic(BREAKOUT_FadeTime); + else printf("There is no game music to be paused!\n"); +} + +// Toggle Game pause, not the music! void BREAKOUT_TogglePause(Scenery * scenery){ (scenery->IsPaused) = !(scenery->IsPaused); printf("Game was %s!\n", ( (scenery->IsPaused) ? "paused" : "unpaused")); @@ -212,7 +232,7 @@ void BREAKOUT_Draw(Scenery * scenery, SDL_Renderer * renderer){ BREAKOUT_DrawLivesHUD(renderer, scenery); if (scenery->IsPaused) { TEXTURE_RenderCentered(renderer, BREAKOUT_PausedTexture, 0.5f); - } else if ((scenery->StartCountdown) > 0) { // ! Render Z-Layer ! + } else if ((scenery->StartCountdown) > 0) { // ! Render Z-Layer ! TEXTURE_RenderCenteredSpriteSheet(renderer, BREAKOUT_CountdownTexture, (BREAKOUT_CountdownSourceRects + (((scenery->StartCountdown) - 1) / 60)), 1.0f); } } @@ -234,7 +254,8 @@ void BREAKOUT_DrawLivesHUD(SDL_Renderer * renderer, Scenery * scenery){ void BREAKOUT_DEINITIALIZE(){ if (BREAKOUT_IsInit) { printf("De-initializing Game...\n"); - Mix_FreeChunk(deathSound); + Mix_FreeChunk(BREAKOUT_DeathSound); + Mix_FreeMusic(BREAKOUT_IngameMusic); SDL_DestroyTexture(BREAKOUT_CountdownTexture); SDL_DestroyTexture(BREAKOUT_PausedTexture); free(PADDLE_MoveLeftKeys); @@ -466,7 +487,7 @@ void BALL_Update(Ball * obj, Scenery * scenery){ } } if ((obj->Location).y > height) { // Collide with box boundaries - Mix_PlayChannel(-1, deathSound, 0); + Mix_PlayChannel(-1, BREAKOUT_DeathSound, 0); scenery->IsGameOver = true; printf("Ball called game_over!\n"); } else BALL_CollideWithBorders(obj); @@ -655,7 +676,7 @@ void BLOCK_Initialize(SDL_Renderer * renderer){ } else printf("Block is already initialized!\n"); } /* PADDLE_Initialize */ -Block BLOCK_CreateDefault() { +Block BLOCK_CreateDefault(){ return (Block) { .TargetRect = (SDL_Rect) {.x = 0, .y = 0, .w = 100, .h = 50 }, .TextureIndex = (rand() % BLOCK_TextureCount), diff --git a/breakout.h b/breakout.h index e299fca..630d395 100644 --- a/breakout.h +++ b/breakout.h @@ -48,12 +48,15 @@ typedef struct sceneryStruct { // Prototypes void BREAKOUT_INITIALIZE(SDL_Renderer * renderer); +void BREAKOUT_StartMusic(); +void BREAKOUT_PauseMusic(); void BREAKOUT_TogglePause(Scenery * scenery); void BREAKOUT_KeyPressed(Scenery * scenery, SDL_KeyboardEvent * b); Scenery BREAKOUT_CreateDefault(); void BREAKOUT_IncreaseScoreBy(Scenery * scenery, int scoreInc); void TEXTURE_RenderCenteredSpriteSheet(SDL_Renderer * renderer, SDL_Texture * texture, SDL_Rect * srcRect, float Scale); void TEXTURE_RenderCentered(SDL_Renderer * renderer, SDL_Texture * texture, float Scale); +void BREAKOUT_PushNewRow(Scenery * scenery); void BREAKOUT_Update(Scenery * scenery, const Uint8 * keystate); void BREAKOUT_Draw(Scenery * scenery, SDL_Renderer * renderer); void BREAKOUT_DrawLivesHUD(SDL_Renderer * renderer, Scenery * scenery); @@ -85,15 +88,17 @@ bool KeyPressed(const Uint8 * keystate, Uint8 * keyArray); void INT_Constrain(int * variable, int min, int max); void DOUBLE_Constrain(double * variable, double min, double max); void PADDLE_MoveSmooth(Paddle * obj); +void PADDLE_MoveAuto(Scenery * scenery); void PADDLE_AdaptSpeedGradient(Paddle * obj, int FrameCount); void PADDLE_Update(Paddle * obj, Scenery * scenery, const Uint8 * keystate); void PADDLE_DestroyObject(Paddle * obj); void PADDLE_Deinitialize(); void BLOCK_Initialize(SDL_Renderer * renderer); -Block BLOCK_CreateDefault() ; +Block BLOCK_CreateDefault(); void BLOCK_DrawTexture(SDL_Renderer * renderer, SDL_Rect * dstRect, int index); void BLOCK_Draw(SDL_Renderer * renderer, Block * obj); void BLOCK_DealDamage(Block * obj, int dmg); +void BLOCK_MoveSmooth(Block * obj); void BLOCK_Update(Block * obj); void BLOCK_DestroyObject(Block * obj); void BLOCK_Deinitialize(); diff --git a/main.c b/main.c index aac8627..2a88d7c 100644 --- a/main.c +++ b/main.c @@ -17,6 +17,9 @@ #include "settings.h" #include "background.h" +#define MAIN_MenuMusicPath "assets/sounds/menu_music.wav" +#define MAIN_FadeTime 1000 + #include "main.h" // Default Render Size (Upscaled for bigger monitors) @@ -33,13 +36,15 @@ SDL_Event event; bool running = true, fullscreen = false; GameState gameState = MainMenu; Scenery scenery; +Mix_Music * MenuLoop; int main(int argc, char * args[]){ + INITIALIZE(); Uint32 fps_lasttime = SDL_GetTicks(); // the last recorded time. Uint32 fps_current; // the current FPS. Uint32 fps_frames = 0; // frames passed since the last recorded fps. - INITIALIZE(); + GAME_ChangeState(MainMenu); while (running) { // Gameloop HandleSDLEvents(); DrawBackground(renderer); @@ -84,7 +89,31 @@ void GAME_Escape(){ printf("GAME_Escape was called!\n"); } +void MENU_StartMusic(){ + printf("Attempting to start menu music...\n"); + if (!Mix_PlayingMusic()) + Mix_FadeInMusic(MenuLoop, -1, MAIN_FadeTime); + else printf("Menu music is already playing!\n"); +} + +void MENU_PauseMusic(){ + printf("Attempting to pause menu music...\n"); + if (Mix_PlayingMusic()) + Mix_HaltMusic(); + // Mix_FadeOutMusic(MAIN_FadeTime); + else printf("There is no menu music to be paused!\n"); +} + void GAME_ChangeState(GameState state){ + if (state == Game) { + printf("Game music starting!\n"); + MENU_PauseMusic(); + BREAKOUT_StartMusic(); + } else { + printf("Menu music starting!\n"); + BREAKOUT_PauseMusic(); + MENU_StartMusic(); + } if (gameState == state) { printf("State wasn't changed!\n"); return; @@ -103,7 +132,7 @@ void GAME_ChangeState(GameState state){ printf("State was changed to %d!\n", gameState); break; } -} +} /* GAME_ChangeState */ void HandleSDLEvents(){ while (SDL_PollEvent(&event)) { @@ -205,11 +234,13 @@ void INITIALIZE() { BACKGROUND_Initialize(renderer, width, height); Settings_Initialize(renderer, &scenery); GAMEOVER_Initialize(renderer); + MenuLoop = Mix_LoadMUS(MAIN_MenuMusicPath); printf("Initializing finished!\n"); } /* INITIALIZE */ void QUIT(){ printf("De-initializing started...\n"); + Mix_FreeMusic(MenuLoop); GAMEOVER_Deinitialize(); BACKGROUND_Deinitialize(); Settings_Deinitialize(); diff --git a/main.h b/main.h index ed861e6..a66139c 100644 --- a/main.h +++ b/main.h @@ -29,15 +29,17 @@ #define ss "\341" // Prototypes +void GAME_Escape(); +void MENU_StartMusic(); +void MENU_PauseMusic(); void GAME_ChangeState(GameState state); void HandleSDLEvents(); -void GAME_Escape(); void mousePress(SDL_MouseButtonEvent b); void keyPress(SDL_KeyboardEvent b); void toggleFullscreen(); void windowChanged(SDL_WindowEvent b); void DrawBackground(SDL_Renderer * renderer); -void INITIALIZE(); +void INITIALIZE() ; void QUIT(); // End Prototypes