diff options
Diffstat (limited to 'games/gold_fever.c')
| -rw-r--r-- | games/gold_fever.c | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/games/gold_fever.c b/games/gold_fever.c new file mode 100644 index 00000000..5a435027 --- /dev/null +++ b/games/gold_fever.c @@ -0,0 +1,288 @@ +/******************************************************************************************* +* +* raylib - sample game: gold fever +* +* 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 + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef struct Player { + Vector2 position; + Vector2 speed; + int radius; +} Player; + +typedef struct Enemy { + Vector2 position; + Vector2 speed; + int radius; + int radiusBounds; + bool moveRight; // RAY: o__O +} Enemy; + +typedef struct Points { + Vector2 position; + int radius; + int value; + bool active; +} Points; + +typedef struct Home { + Rectangle rec; + bool active; + bool save; + Color color; +} Home; + +//------------------------------------------------------------------------------------ +// 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 Player player; +static Enemy enemy; +static Points points; +static Home home; +static bool follow; + +//------------------------------------------------------------------------------------ +// 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: gold fever"); + + 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) +{ + pause = false; + score = 0; + + player.position = (Vector2){50, 50}; + player.radius = 20; + player.speed = (Vector2){5, 5}; + + enemy.position = (Vector2){screenWidth - 50, screenHeight/2}; + enemy.radius = 20; + enemy.radiusBounds = 150; + enemy.speed = (Vector2){3, 3}; + enemy.moveRight = true; + follow = false; + + points.radius = 10; + points.position = (Vector2){GetRandomValue(points.radius, screenWidth - points.radius), GetRandomValue(points.radius, screenHeight - points.radius)}; + points.value = 100; + points.active = true; + + home.rec.width = 50; + home.rec.height = 50; + home.rec.x = GetRandomValue(0, screenWidth - home.rec.width); + home.rec.y = GetRandomValue(0, screenHeight - home.rec.height); + home.active = false; + home.save = false; +} + +// Update game (one frame) +void UpdateGame(void) +{ + if (!gameOver) + { + if (IsKeyPressed('P')) pause = !pause; + + if (!pause) + { + //Control player + if (IsKeyDown(KEY_RIGHT)) player.position.x += player.speed.x; + if (IsKeyDown(KEY_LEFT)) player.position.x -= player.speed.x; + if (IsKeyDown(KEY_UP)) player.position.y -= player.speed.y; + if (IsKeyDown(KEY_DOWN)) player.position.y += player.speed.y; + + //wall behaviour player + if (player.position.x - player.radius <= 0) player.position.x = player.radius; + if (player.position.x + player.radius >= screenWidth) player.position.x = screenWidth - player.radius; + if (player.position.y - player.radius <= 0) player.position.y = player.radius; + if (player.position.y + player.radius >= screenHeight) player.position.y = screenHeight - player.radius; + + //IA Enemy + if ( (follow || CheckCollisionCircles(player.position, player.radius, enemy.position, enemy.radiusBounds)) && !home.save) + { + if (player.position.x > enemy.position.x) enemy.position.x += enemy.speed.x; + if (player.position.x < enemy.position.x) enemy.position.x -= enemy.speed.x; + + if (player.position.y > enemy.position.y) enemy.position.y += enemy.speed.y; + if (player.position.y < enemy.position.y) enemy.position.y -= enemy.speed.y; + } + else + { + if (enemy.moveRight) enemy.position.x += enemy.speed.x; + else enemy.position.x -= enemy.speed.x; + } + + //wall behaviour enemy + if (enemy.position.x - enemy.radius <= 0) enemy.moveRight = true; + if (enemy.position.x + enemy.radius >= screenWidth) enemy.moveRight = false; + + if (enemy.position.x - enemy.radius <= 0) enemy.position.x = enemy.radius; + if (enemy.position.x + enemy.radius >= screenWidth) enemy.position.x = screenWidth - enemy.radius; + if (enemy.position.y - enemy.radius <= 0) enemy.position.y = enemy.radius; + if (enemy.position.y + enemy.radius >= screenHeight) enemy.position.y = screenHeight - enemy.radius; + + //Collisions + if (CheckCollisionCircles(player.position, player.radius, points.position, points.radius) && points.active) + { + follow = true; + points.active = false; + home.active = true; + } + + if (CheckCollisionCircles(player.position, player.radius, enemy.position, enemy.radius) && !home.save) + { + gameOver = true; + + if (hiScore < score) hiScore = score; + } + + if (CheckCollisionCircleRec(player.position, player.radius, home.rec)) + { + follow = false; + + if (!points.active) + { + score += points.value; + points.active = true; + enemy.speed.x += 0.5; + enemy.speed.y += 0.5; + points.position = (Vector2){GetRandomValue(points.radius, screenWidth - points.radius), GetRandomValue(points.radius, screenHeight - points.radius)}; + } + + home.save = true; + } + else home.save = false; + } + } + else + { + if (IsKeyPressed(KEY_ENTER)) + { + InitGame(); + gameOver = false; + } + } +} + +// Draw game (one frame) +void DrawGame(void) +{ + BeginDrawing(); + + ClearBackground(RAYWHITE); + + if (!gameOver) + { + if (follow) + { + DrawRectangle(0, 0, screenWidth, screenHeight, RED); + DrawRectangle(10, 10, screenWidth - 20, screenHeight - 20, RAYWHITE); + } + + DrawRectangleLines(home.rec.x, home.rec.y, home.rec.width, home.rec.height, BLUE); + + DrawCircleLines(enemy.position.x, enemy.position.y, enemy.radiusBounds, RED); + DrawCircleV(enemy.position, enemy.radius, MAROON); + + DrawCircleV(player.position, player.radius, GRAY); + if (points.active) DrawCircleV(points.position, points.radius, GOLD); + + DrawText(FormatText("SCORE: %04i", score), 20, 15, 20, GRAY); + DrawText(FormatText("HI-SCORE: %04i", hiScore), 300, 15, 20, GRAY); + + 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 |
