about summary refs log blame commit diff stats
path: root/src/versus.c
blob: bf6027e80157e4d485b91a49e5d6a77d6f63f7fb (plain) (tree)
1
2
3
4
5
6
7
8
9
                 
                   
 
                    
                               



                              
                                  




                             
                             





                              
 
                        

                                                                    
                                                    
    
                     


                                                                     
                                 




                                                                                         

                                                                      
                        



                                        
                                

                                               




                                                          
                                                     
                
                                                                                   

                              



                                                                                             
                              
                                       


                                                    










                                                                                                              


                                                    











                                                                                                              
                              





                                                                    
                                                         
                                       
                                                                   
                                       
                                                                    






                                                                         
                                                

                                                                        
                 
                





                                                 
                                                     







                                            
                               

                                                                                        
                                                            

                                           
                                               

                                                                      


                                                
                                                                                         


                                                                                
                                                                      



                                                                         



                                    

           
#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( 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;
}