#include "pong.h" #include void versus_main() { /* Init Player Variables */ struct Players Player; Player.Y = 0; Player.Score = 0; /* Init Enemy Variables */ struct Players Enemy; Enemy.Y = 0; Enemy.Score = 0; Enemy.Direction = 0; /* Init Ball Variables */ struct Balls Ball; Ball.X = 1280/2.0f; Ball.Y = 720/2.0f; Ball.Direction = LEFT; Ball.Speed = 3.0f; Ball.Angle = 0.0f; /* Init music */ Mix_Music *Background = Mix_LoadMUS("resources/versus.wav"); Mix_PlayMusic(Background, -1); Mix_VolumeMusic(GlobalSettings.MusicVolume); /* Set Sprites */ Texture2D PaddleSprite = LoadTexture("resources/paddle.png"); Texture2D BallSprite = LoadTexture("resources/ball.png"); /* Set Collision Boxes */ Player.HitBox = (Rectangle){80, Player.Y, 5, PaddleSprite.height}; Enemy.HitBox = (Rectangle){1200, Enemy.Y, 5, PaddleSprite.height}; Ball.HitBox = (Rectangle){Ball.X, Ball.Y, BallSprite.width, BallSprite.height}; Enemy.BallDetector = (Rectangle){0, Enemy.Y+120, 1280, PaddleSprite.height/5.0f}; char EnemyScore[50]; char PlayerScore[50]; /* Used later to display score on screen. */ /* Init Camera */ Camera2D MainCamera; MainCamera.target = (Vector2){0, 0}; MainCamera.offset = (Vector2){0, 0}; MainCamera.rotation = 0; bool VersusGoing = true; Ball.NextTick = SDL_AtomicGet(&Ticks); Enemy.NextTick = SDL_AtomicGet(&Ticks); Vector2 MouseLastPosition = GetMousePosition(); Vector2 MouseCurrentPosition = GetMousePosition(); bool MouseMoved = false; while(VersusGoing == true && GameGoing == true) { if (WindowShouldClose()) { /* Quit Game if the window is closed. */ GameGoing = false; } MainCamera.zoom = GetScreenHeight()/720.0f; MainCamera.offset = (Vector2){GetScreenWidth()/2.0f, GetScreenHeight()/2.0f}; MainCamera.target = (Vector2){1280/2.0f, 720/2.0f}; /* Who won? */ if (Enemy.Score >= 5) { Mix_HaltMusic(); Mix_FreeMusic(Background); play_audio(STOP_ALL_SOUNDS); play_audio(MUSIC_DEFEAT); while(!IsKeyDown(KEY_SPACE)) { BeginDrawing(); EnableCursor(); ClearBackground(BLACK); DrawText("You Lose.", 0, 0, 128, RED); DrawText("Press space to return to title screen.", 0, 128, 24, WHITE); EndDrawing(); } return; } else if (Player.Score >= 5) { Mix_HaltMusic(); Mix_FreeMusic(Background); play_audio(STOP_ALL_SOUNDS); play_audio(MUSIC_VICTORY); while(!IsKeyDown(KEY_SPACE)) { BeginDrawing(); EnableCursor(); ClearBackground(BLACK); DrawText("You Win!", 0, 0, 128, BLUE); DrawText("Press space to return to title screen.", 0, 128, 24, WHITE); EndDrawing(); } return; } /* Controls */ MouseMoved = false; MouseCurrentPosition = GetMousePosition(); if (MouseCurrentPosition.y != MouseLastPosition.y) { MouseMoved = true; } MouseLastPosition = MouseCurrentPosition; if( player_controls() == CONTROLLER_UP ){ Player.Y -= 20; } else if ( player_controls() == CONTROLLER_DOWN ){ Player.Y += 20; } else if ( player_controls() == CONTROLLER_PAUSE ){ Mix_PauseMusic(); BeginDrawing(); EndDrawing(); VersusGoing = pause_screen(&MainCamera); Mix_ResumeMusic(); Ball.NextTick = SDL_AtomicGet(&Ticks)+1; Enemy.NextTick = SDL_AtomicGet(&Ticks)+1; } else if (MouseMoved == true) { Player.Y = GetMouseY()-PaddleSprite.height/2.0f; DisableCursor(); } if(GetMouseY() < 0) { SetMousePosition(0, 0); } else if(GetMouseY() > 720) { SetMousePosition(0, 720); } /* Check if players are off-screen */ if (Player.Y < 0) { Player.Y = 0; } else if (Player.Y > 480) { Player.Y = 480; } enemy(&Enemy, Ball); /* Collision */ ball(&Player.HitBox, &Enemy.HitBox, &Ball, &Player.Score, &Enemy.Score); /* Updates hitbox with player's position. */ Player.HitBox.y = Player.Y; /* Turn Scores into strings. */ snprintf(PlayerScore, 50, "Player: %d", Player.Score); snprintf(EnemyScore, 50, "Enemy: %d", Enemy.Score); BeginDrawing(); ClearBackground(BLACK); BeginMode2D(MainCamera); DrawRectangle(0, 0, 1280, 720, (Color){20, 20, 20, 255}); DrawTexture(PaddleSprite, 0, Player.Y, WHITE); DrawTexture(PaddleSprite, 1200, Enemy.Y, WHITE); DrawTexture(BallSprite, Ball.X, Ball.Y, WHITE); DrawText(PlayerScore, 0, 0, 32, BLUE); DrawText(EnemyScore, 1130, 688, 32, RED); EndMode2D(); EndDrawing(); } Mix_HaltMusic(); Mix_FreeMusic(Background); play_audio(STOP_ALL_SOUNDS); return; }