| @ -0,0 +1,143 @@ | |||||
| /******************************************************************************************* | |||||
| * | |||||
| * raylib [shapes] example - simple starfield | |||||
| * | |||||
| * Example complexity rating: [★☆☆☆] 1/4 | |||||
| * | |||||
| * Example originally created with raylib 5.5 | |||||
| * | |||||
| * Example contributed by JP Mortiboys (@themushroompirates) and reviewed by Ramon Santamaria (@raysan5) | |||||
| * | |||||
| * Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, | |||||
| * BSD-like license that allows static linking with closed source software | |||||
| * | |||||
| * Copyright (c) 2025 JP Mortiboys (@themushroompirates) | |||||
| * | |||||
| ********************************************************************************************/ | |||||
| #include "raylib.h" | |||||
| #include "raymath.h" // Required for: Lerp() | |||||
| #define STAR_COUNT 420 | |||||
| //------------------------------------------------------------------------------------ | |||||
| // Program main entry point | |||||
| //------------------------------------------------------------------------------------ | |||||
| int main(void) | |||||
| { | |||||
| // Initialization | |||||
| //-------------------------------------------------------------------------------------- | |||||
| const int screenWidth = 800; | |||||
| const int screenHeight = 450; | |||||
| InitWindow(screenWidth, screenHeight, "raylib [shapes] example - starfield"); | |||||
| Color bgColor = ColorLerp(DARKBLUE, BLACK, 0.69f); | |||||
| // Speed at which we fly forward | |||||
| float speed = 10.0f/9.0f; | |||||
| // We're either drawing lines or circles | |||||
| bool drawLines = true; | |||||
| Vector3 stars[STAR_COUNT] = { 0 }; | |||||
| Vector2 starsScreenPos[STAR_COUNT] = { 0 }; | |||||
| // Setup the stars with a random position | |||||
| for (int i = 0; i < STAR_COUNT; i++) { | |||||
| stars[i].x = GetRandomValue(-screenWidth*.5, screenWidth*.5); | |||||
| stars[i].y = GetRandomValue(-screenHeight*.5, screenHeight*.5); | |||||
| stars[i].z = 1.0f; | |||||
| } | |||||
| SetTargetFPS(60); // Set our game to run at 60 frames-per-second | |||||
| //-------------------------------------------------------------------------------------- | |||||
| // Main game loop | |||||
| while (!WindowShouldClose()) // Detect window close button or ESC key | |||||
| { | |||||
| // Update | |||||
| //---------------------------------------------------------------------------------- | |||||
| // Change speed based on number keys | |||||
| for (int i = 0; i <= 9; i++) { | |||||
| if (IsKeyPressed(KEY_ZERO + i)) { | |||||
| speed = 2.0f * (float)i / 9.0f; | |||||
| } | |||||
| } | |||||
| // Toggle lines / points with space bar | |||||
| if (IsKeyPressed(KEY_SPACE)) { | |||||
| drawLines = !drawLines; | |||||
| } | |||||
| float dt = GetFrameTime(); | |||||
| for (int i = 0; i < STAR_COUNT; i++) { | |||||
| // Update star's timer | |||||
| stars[i].z -= dt * speed; | |||||
| // Calculate the screen position | |||||
| starsScreenPos[i] = (Vector2) { | |||||
| screenWidth*.5f + stars[i].x / stars[i].z, | |||||
| screenHeight*.5f + stars[i].y / stars[i].z, | |||||
| }; | |||||
| // If the star is too old, or offscreen, it dies and we make a new random one | |||||
| if (stars[i].z < 0.0f | |||||
| || starsScreenPos[i].x < 0 || starsScreenPos[i].y < 0.0f | |||||
| || starsScreenPos[i].x > screenWidth || starsScreenPos[i].y > screenHeight) { | |||||
| stars[i].x = GetRandomValue(-screenWidth*.5, screenWidth*.5); | |||||
| stars[i].y = GetRandomValue(-screenHeight*.5, screenHeight*.5); | |||||
| stars[i].z = 1.0f; | |||||
| } | |||||
| } | |||||
| //---------------------------------------------------------------------------------- | |||||
| // Draw | |||||
| //---------------------------------------------------------------------------------- | |||||
| BeginDrawing(); | |||||
| ClearBackground(bgColor); | |||||
| for (int i = 0; i < STAR_COUNT; i++) { | |||||
| if (drawLines) { | |||||
| // Get the time a little while ago for this star, but clamp it | |||||
| float t = Clamp(stars[i].z + 1.0f/32.0f, 0.0f, 1.0f); | |||||
| // If it's different enough from the current time, we proceed | |||||
| if (t - stars[i].z > 1e-3) { | |||||
| // Calculate the screen position of the old point | |||||
| Vector2 startPos = (Vector2) { | |||||
| screenWidth*.5f + stars[i].x / t, | |||||
| screenHeight*.5f + stars[i].y / t, | |||||
| }; | |||||
| // Draw a line connecting the old point to the current point | |||||
| DrawLineV(startPos, starsScreenPos[i], RAYWHITE); | |||||
| } | |||||
| } | |||||
| else { | |||||
| // Make the radius grow as the star ages | |||||
| float radius = Lerp(stars[i].z, 1.0f, 5.0f); | |||||
| // Draw the circle | |||||
| DrawCircleV(starsScreenPos[i], radius, RAYWHITE); | |||||
| } | |||||
| } | |||||
| DrawFPS(10, 10); | |||||
| DrawText(TextFormat("Current Speed: %.0f [Number keys to change]", 9.0f * speed / 2.0f), 10, 30, 20, RAYWHITE); | |||||
| DrawText(TextFormat("Drawing %s [Space to change]", drawLines ? "Lines" : "Circles"), 10, 50, 20, RAYWHITE); | |||||
| EndDrawing(); | |||||
| //---------------------------------------------------------------------------------- | |||||
| } | |||||
| // De-Initialization | |||||
| //-------------------------------------------------------------------------------------- | |||||
| CloseWindow(); // Close window and OpenGL context | |||||
| //-------------------------------------------------------------------------------------- | |||||
| return 0; | |||||
| } | |||||