#include "pong.h"
#include <raylib.h>
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(IsKeyDown(KEY_W) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_UP)) {
Player.Y -= 20;
} else if (IsKeyDown(KEY_S) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_DOWN)) {
Player.Y += 20;
} else if (IsKeyPressed(KEY_ESCAPE)) {
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();
}
/* Leave Game */
if(IsKeyPressed(KEY_Q)) {
VersusGoing = false;
}
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;
}