/*******************************************************************************************
							 | 
						|
								*
							 | 
						|
								*   raylib game - Floppy Bird
							 | 
						|
								*
							 | 
						|
								*   This game has been created using raylib 1.1 (www.raylib.com)
							 | 
						|
								*   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
							 | 
						|
								*
							 | 
						|
								*   Copyright (c) 2014 Ramon Santamaria (Ray San - raysan@raysanweb.com)
							 | 
						|
								*
							 | 
						|
								********************************************************************************************/
							 | 
						|
								
							 | 
						|
								#include "raylib.h"
							 | 
						|
								
							 | 
						|
								#define MAX_TUBES 100
							 | 
						|
								
							 | 
						|
								int main()
							 | 
						|
								{    
							 | 
						|
								    // Initialization
							 | 
						|
								    //--------------------------------------------------------------------------------------
							 | 
						|
								    int screenWidth = 800;
							 | 
						|
								    int screenHeight = 450;
							 | 
						|
								
							 | 
						|
								    InitWindow(screenWidth, screenHeight, "Floppy Bird");
							 | 
						|
								    
							 | 
						|
								    InitAudioDevice();      // Initialize audio device
							 | 
						|
								    
							 | 
						|
								    Sound coin = LoadSound("resources/coin.wav");
							 | 
						|
								    Sound jump = LoadSound("resources/jump.wav");
							 | 
						|
								    
							 | 
						|
								    Texture2D background = LoadTexture("resources/background.png");
							 | 
						|
								    Texture2D tubes = LoadTexture("resources/tubes.png");
							 | 
						|
								    Texture2D floppy = LoadTexture("resources/floppy.png");
							 | 
						|
								    
							 | 
						|
								    Vector2 floppyPos = { 80, screenHeight/2 - floppy.height/2 };
							 | 
						|
								    
							 | 
						|
								    Vector2 tubesPos[MAX_TUBES];
							 | 
						|
								    int tubesSpeedX = 2;
							 | 
						|
								    
							 | 
						|
								    for (int i = 0; i < MAX_TUBES; i++)
							 | 
						|
								    {
							 | 
						|
								        tubesPos[i].x = 400 + 280*i;
							 | 
						|
								        tubesPos[i].y = -GetRandomValue(0, 120);
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    Rectangle tubesRecs[MAX_TUBES*2];
							 | 
						|
								    bool tubesActive[MAX_TUBES];
							 | 
						|
								    
							 | 
						|
								    for (int i = 0; i < MAX_TUBES*2; i += 2)
							 | 
						|
								    {
							 | 
						|
								        tubesRecs[i].x = tubesPos[i/2].x;
							 | 
						|
								        tubesRecs[i].y = tubesPos[i/2].y;
							 | 
						|
								        tubesRecs[i].width = tubes.width;
							 | 
						|
								        tubesRecs[i].height = 255;
							 | 
						|
								        
							 | 
						|
								        tubesRecs[i+1].x = tubesPos[i/2].x;
							 | 
						|
								        tubesRecs[i+1].y = 600 + tubesPos[i/2].y - 255;
							 | 
						|
								        tubesRecs[i+1].width = tubes.width;
							 | 
						|
								        tubesRecs[i+1].height = 255;
							 | 
						|
								        
							 | 
						|
								        tubesActive[i/2] = true;
							 | 
						|
								    }
							 | 
						|
								 
							 | 
						|
								    int backScroll = 0;
							 | 
						|
								    
							 | 
						|
								    int score = 0;
							 | 
						|
								    int hiscore = 0;
							 | 
						|
								    
							 | 
						|
								    bool gameover = false;
							 | 
						|
								    bool superfx = false;
							 | 
						|
								    
							 | 
						|
								    SetTargetFPS(60);
							 | 
						|
								    //---------------------------------------------------------------------------------------
							 | 
						|
								    
							 | 
						|
								    // Main game loop
							 | 
						|
								    while (!WindowShouldClose())    // Detect window close button or ESC key
							 | 
						|
								    {
							 | 
						|
								        // Update
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								        
							 | 
						|
								        // Background scroll logic
							 | 
						|
								        backScroll--;
							 | 
						|
								        if (backScroll <= -800) backScroll = 0; 
							 | 
						|
								        
							 | 
						|
								        // Player movement logic
							 | 
						|
								        if (!gameover)
							 | 
						|
								        {
							 | 
						|
								            if (IsKeyDown(KEY_SPACE)) floppyPos.y -= 3;
							 | 
						|
								            else floppyPos.y += 1;
							 | 
						|
								        
							 | 
						|
								            if (IsKeyPressed(KEY_SPACE)) PlaySound(jump);
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        // Tubes moving logic
							 | 
						|
								        for (int i = 0; i < MAX_TUBES; i++) tubesPos[i].x -= tubesSpeedX;
							 | 
						|
								        
							 | 
						|
								        for (int i = 0; i < MAX_TUBES*2; i += 2)
							 | 
						|
								        {
							 | 
						|
								            tubesRecs[i].x = tubesPos[i/2].x;
							 | 
						|
								            tubesRecs[i+1].x = tubesPos[i/2].x;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Check collisions player-tubes
							 | 
						|
								        for (int i = 0; i < MAX_TUBES*2; i++)
							 | 
						|
								        {
							 | 
						|
								            if (CheckCollisionCircleRec((Vector2){ floppyPos.x + floppy.width/2, floppyPos.y + floppy.height/2 }, floppy.width/2, tubesRecs[i])) 
							 | 
						|
								            {
							 | 
						|
								                gameover = true;
							 | 
						|
								            }
							 | 
						|
								            else if ((tubesPos[i/2].x < floppyPos.x) && tubesActive[i/2] && !gameover)
							 | 
						|
								            {
							 | 
						|
								                score += 100;
							 | 
						|
								                tubesActive[i/2] = false;
							 | 
						|
								                PlaySound(coin);
							 | 
						|
								                
							 | 
						|
								                superfx = true;
							 | 
						|
								                
							 | 
						|
								                if (score > hiscore) hiscore = score;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        // Gameover logic for reset
							 | 
						|
								        if (gameover && IsKeyPressed(KEY_ENTER))
							 | 
						|
								        {
							 | 
						|
								            for (int i = 0; i < MAX_TUBES; i++)
							 | 
						|
								            {
							 | 
						|
								                tubesPos[i].x = 400 + 280*i;
							 | 
						|
								                tubesPos[i].y = -GetRandomValue(0, 120);
							 | 
						|
								            }
							 | 
						|
								    
							 | 
						|
								            for (int i = 0; i < MAX_TUBES*2; i += 2)
							 | 
						|
								            {
							 | 
						|
								                tubesRecs[i].x = tubesPos[i/2].x;
							 | 
						|
								                tubesRecs[i].y = tubesPos[i/2].y;
							 | 
						|
								                
							 | 
						|
								                tubesRecs[i+1].x = tubesPos[i/2].x;
							 | 
						|
								                tubesRecs[i+1].y = 600 + tubesPos[i/2].y - 255;
							 | 
						|
								                
							 | 
						|
								                tubesActive[i/2] = true;
							 | 
						|
								            }
							 | 
						|
								        
							 | 
						|
								            floppyPos.x = 80;
							 | 
						|
								            floppyPos.y = screenHeight/2 - floppy.height/2;
							 | 
						|
								            
							 | 
						|
								            gameover = false;
							 | 
						|
								            score = 0;
							 | 
						|
								        }
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								        
							 | 
						|
								        // Draw
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								        BeginDrawing();
							 | 
						|
								        
							 | 
						|
								            ClearBackground(RAYWHITE);
							 | 
						|
								            
							 | 
						|
								            // Draw scrolling background
							 | 
						|
								            DrawTexture(background, backScroll, 0, WHITE);
							 | 
						|
								            DrawTexture(background, screenWidth + backScroll, 0, WHITE);
							 | 
						|
								            
							 | 
						|
								            // Draw moving tubes
							 | 
						|
								            for (int i = 0; i < MAX_TUBES; i++)
							 | 
						|
								            {
							 | 
						|
								                if (tubesPos[i].x <= 800) DrawTextureEx(tubes, tubesPos[i], 0, 1.0, WHITE);
							 | 
						|
								            
							 | 
						|
								                // Draw collision recs
							 | 
						|
								                //DrawRectangleLines(tubesRecs[i*2].x, tubesRecs[i*2].y, tubesRecs[i*2].width, tubesRecs[i*2].height, RED);
							 | 
						|
								                //DrawRectangleLines(tubesRecs[i*2 + 1].x, tubesRecs[i*2 + 1].y, tubesRecs[i*2 + 1].width, tubesRecs[i*2 + 1].height, RED);
							 | 
						|
								            }
							 | 
						|
								            
							 | 
						|
								            // Draw scores
							 | 
						|
								            DrawText(FormatText("%04i", score), 20, 20, 40, PINK);
							 | 
						|
								            DrawText(FormatText("HI-SCORE: %04i", hiscore), 20, 70, 20, VIOLET); 
							 | 
						|
								            
							 | 
						|
								            // Draw player or game over messages
							 | 
						|
								            if (!gameover)
							 | 
						|
								            {
							 | 
						|
								                DrawTextureEx(floppy, floppyPos, 0, 1.0, WHITE);
							 | 
						|
								                
							 | 
						|
								                // Draw collision circle
							 | 
						|
								                //DrawCircleLines(floppyPos.x + floppy.width/2, floppyPos.y + floppy.height/2, floppy.width/2, RED);
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                DrawText("GAME OVER", 100, 180, 100, MAROON);
							 | 
						|
								                DrawText("PRESS ENTER to RETRY!", 280, 280, 20, RED);    
							 | 
						|
								            }
							 | 
						|
								            
							 | 
						|
								            // Draw screen light flash when passing through a tube
							 | 
						|
								            if (superfx)
							 | 
						|
								            {
							 | 
						|
								                DrawRectangle(0, 0, screenWidth, screenHeight, GOLD);
							 | 
						|
								                superfx = false;
							 | 
						|
								            }
							 | 
						|
								        
							 | 
						|
								        EndDrawing();
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    // De-Initialization
							 | 
						|
								    //--------------------------------------------------------------------------------------
							 | 
						|
								    UnloadTexture(background);  // Texture unloading
							 | 
						|
								    UnloadTexture(tubes);       // Texture unloading
							 | 
						|
								    UnloadTexture(floppy);      // Texture unloading
							 | 
						|
								    
							 | 
						|
								    UnloadSound(coin);          // Unload sound data
							 | 
						|
								    UnloadSound(jump);          // Unload sound data
							 | 
						|
								    
							 | 
						|
								    CloseAudioDevice();         // Close audio device
							 | 
						|
								    
							 | 
						|
								    CloseWindow();              // Close window and OpenGL context
							 | 
						|
								    //--------------------------------------------------------------------------------------
							 | 
						|
								    
							 | 
						|
								    return 0;
							 | 
						|
								}
							 |