diff options
| author | raysan5 <[email protected]> | 2016-02-20 20:25:01 +0100 |
|---|---|---|
| committer | raysan5 <[email protected]> | 2016-02-20 20:25:01 +0100 |
| commit | 7b360d8579c63658ee05377b44d2e0b478d12b74 (patch) | |
| tree | 16c1553ba117869aeb370ae40f99bb4086701b55 /games/floppy.c | |
| parent | 83459159f4c8622cefe93a062138e7e2391b6761 (diff) | |
| download | raylib-7b360d8579c63658ee05377b44d2e0b478d12b74.tar.gz raylib-7b360d8579c63658ee05377b44d2e0b478d12b74.zip | |
Reorganized games folder
Simplified to match raylib installer package folder structure
Diffstat (limited to 'games/floppy.c')
| -rw-r--r-- | games/floppy.c | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/games/floppy.c b/games/floppy.c new file mode 100644 index 00000000..f48ea235 --- /dev/null +++ b/games/floppy.c @@ -0,0 +1,246 @@ +/******************************************************************************************* +* +* 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 <emscripten/emscripten.h> +#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 int screenWidth = 800; +static int screenHeight = 450; + +static int framesCounter; +static bool gameOver; +static bool pause; +static int score; +static int hiScore = 0; + +static Floppy floppy; +static Tubes tubes[MAX_TUBES*2]; +static Vector2 tubesPos[MAX_TUBES]; +static int tubesSpeedX; +static bool superfx; + +//------------------------------------------------------------------------------------ +// 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() +{ + // 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 + //---------------------------------------------------------------------------------- + UpdateGame(); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + DrawGame(); + //---------------------------------------------------------------------------------- + } +#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(FormatText("%04i", score), 20, 20, 40, GRAY); + DrawText(FormatText("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(); +}
\ No newline at end of file |
