Browse Source

Added small floppy game

raysan5 10 years ago
parent
commit
21d8394170

+ 210 - 0
games/floppy/floppy.c

@@ -0,0 +1,210 @@
+/*******************************************************************************************
+*
+*   raylib game - Floppy Bird
+*
+*   Welcome to raylib!
+*
+*   To test examples, just press F6 and execute raylib_compile_execute script
+*   Note that compiled executable is placed in the same folder as .c file
+*
+*   You can find all basic examples on C:\raylib\raylib\examples folder or
+*   raylib official webpage: www.raylib.com
+*
+*   Enjoy using raylib. :)
+*
+*   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 - [email protected])
+*
+********************************************************************************************/
+
+#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
+        //----------------------------------------------------------------------------------
+        backScroll--;
+        
+        if (backScroll <= -800) backScroll = 0; 
+        
+        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;
+        }
+
+        if (IsKeyDown(KEY_SPACE) && !gameover) floppyPos.y -= 3;
+        else floppyPos.y += 1;
+        
+        if (IsKeyPressed(KEY_SPACE) && !gameover) PlaySound(jump);
+        
+        // Check Collisions
+        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;
+            }
+        }
+        
+        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);
+            
+            DrawTexture(background, backScroll, 0, WHITE);
+            DrawTexture(background, screenWidth + backScroll, 0, WHITE);
+            
+            if (!gameover)
+            {
+                DrawTextureEx(floppy, floppyPos, 0, 1.0, WHITE);
+                //DrawCircleLines(floppyPos.x + floppy.width/2, floppyPos.y + floppy.height/2, floppy.width/2, RED);
+            }
+            
+            for (int i = 0; i < MAX_TUBES; i++)
+            {
+                if (tubesPos[i].x <= 800) DrawTextureEx(tubes, tubesPos[i], 0, 1.0, WHITE);
+            
+                //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);
+            }
+            
+            DrawText(FormatText("%04i", score), 20, 20, 40, PINK);
+            DrawText(FormatText("HI-SCORE: %04i", hiscore), 20, 70, 20, VIOLET); 
+            
+            if (gameover)
+            {
+                DrawText("GAME OVER", 100, 180, 100, MAROON);
+                DrawText("PRESS ENTER to RETRY!", 280, 280, 20, RED);    
+            }
+            
+            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;
+}

BIN
games/floppy/resources/background.png


BIN
games/floppy/resources/coin.wav


BIN
games/floppy/resources/floppy.png


BIN
games/floppy/resources/jump.wav


BIN
games/floppy/resources/tubes.png