/******************************************************************************************* * * raylib - sample game: floppy * * Sample game developed by Ian Eito, Albert Martos and Ramon Santamaria * * This game has been created using raylib v1.3 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * * Copyright (c) 2015 Ramon Santamaria (@raysan5) * ********************************************************************************************/ #include "raylib.h" #if defined(PLATFORM_WEB) #include #endif //---------------------------------------------------------------------------------- // Some Defines //---------------------------------------------------------------------------------- #define MAX_TUBES 100 #define FLOPPY_RADIUS 24 #define TUBES_WIDTH 80 //---------------------------------------------------------------------------------- // Types and Structures Definition //---------------------------------------------------------------------------------- typedef struct Floppy { Vector2 position; int radius; Color color; } Floppy; typedef struct Tubes { Rectangle rec; Color color; bool active; } Tubes; //------------------------------------------------------------------------------------ // Global Variables Declaration //------------------------------------------------------------------------------------ static const int screenWidth = 800; static const int screenHeight = 450; static bool gameOver = false; static bool pause = false; static int score = 0; static int hiScore = 0; static Floppy floppy = { 0 }; static Tubes tubes[MAX_TUBES*2] = { 0 }; static Vector2 tubesPos[MAX_TUBES] = { 0 }; static int tubesSpeedX = 0; static bool superfx = false; //------------------------------------------------------------------------------------ // Module Functions Declaration (local) //------------------------------------------------------------------------------------ static void InitGame(void); // Initialize game static void UpdateGame(void); // Update game (one frame) static void DrawGame(void); // Draw game (one frame) static void UnloadGame(void); // Unload game static void UpdateDrawFrame(void); // Update and Draw (one frame) //------------------------------------------------------------------------------------ // Program main entry point //------------------------------------------------------------------------------------ int main(void) { // Initialization //--------------------------------------------------------- InitWindow(screenWidth, screenHeight, "sample game: floppy"); InitGame(); #if defined(PLATFORM_WEB) emscripten_set_main_loop(UpdateDrawFrame, 0, 1); #else SetTargetFPS(60); //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update and Draw //---------------------------------------------------------------------------------- UpdateDrawFrame(); //---------------------------------------------------------------------------------- } #endif // De-Initialization //-------------------------------------------------------------------------------------- UnloadGame(); // Unload loaded data (textures, sounds, models...) CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; } //------------------------------------------------------------------------------------ // Module Functions Definitions (local) //------------------------------------------------------------------------------------ // Initialize game variables void InitGame(void) { floppy.radius = FLOPPY_RADIUS; floppy.position = (Vector2){80, screenHeight/2 - floppy.radius}; tubesSpeedX = 2; 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) { tubes[i].rec.x = tubesPos[i/2].x; tubes[i].rec.y = tubesPos[i/2].y; tubes[i].rec.width = TUBES_WIDTH; tubes[i].rec.height = 255; tubes[i+1].rec.x = tubesPos[i/2].x; tubes[i+1].rec.y = 600 + tubesPos[i/2].y - 255; tubes[i+1].rec.width = TUBES_WIDTH; tubes[i+1].rec.height = 255; tubes[i/2].active = true; } score = 0; gameOver = false; superfx = false; pause = false; } // Update game (one frame) void UpdateGame(void) { if (!gameOver) { if (IsKeyPressed('P')) pause = !pause; if (!pause) { for (int i = 0; i < MAX_TUBES; i++) tubesPos[i].x -= tubesSpeedX; for (int i = 0; i < MAX_TUBES*2; i += 2) { tubes[i].rec.x = tubesPos[i/2].x; tubes[i+1].rec.x = tubesPos[i/2].x; } if (IsKeyDown(KEY_SPACE) && !gameOver) floppy.position.y -= 3; else floppy.position.y += 1; // Check Collisions for (int i = 0; i < MAX_TUBES*2; i++) { if (CheckCollisionCircleRec(floppy.position, floppy.radius, tubes[i].rec)) { gameOver = true; pause = false; } else if ((tubesPos[i/2].x < floppy.position.x) && tubes[i/2].active && !gameOver) { score += 100; tubes[i/2].active = false; superfx = true; if (score > hiScore) hiScore = score; } } } } else { if (IsKeyPressed(KEY_ENTER)) { InitGame(); gameOver = false; } } } // Draw game (one frame) void DrawGame(void) { BeginDrawing(); ClearBackground(RAYWHITE); if (!gameOver) { DrawCircle(floppy.position.x, floppy.position.y, floppy.radius, DARKGRAY); // Draw tubes for (int i = 0; i < MAX_TUBES; i++) { DrawRectangle(tubes[i*2].rec.x, tubes[i*2].rec.y, tubes[i*2].rec.width, tubes[i*2].rec.height, GRAY); DrawRectangle(tubes[i*2 + 1].rec.x, tubes[i*2 + 1].rec.y, tubes[i*2 + 1].rec.width, tubes[i*2 + 1].rec.height, GRAY); } // Draw flashing fx (one frame only) if (superfx) { DrawRectangle(0, 0, screenWidth, screenHeight, WHITE); superfx = false; } DrawText(TextFormat("%04i", score), 20, 20, 40, GRAY); DrawText(TextFormat("HI-SCORE: %04i", hiScore), 20, 70, 20, LIGHTGRAY); if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY); } else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY); EndDrawing(); } // Unload game variables void UnloadGame(void) { // TODO: Unload all dynamic loaded data (textures, sounds, models...) } // Update and Draw (one frame) void UpdateDrawFrame(void) { UpdateGame(); DrawGame(); }