Ver código fonte

Added simple starfield example (#5255)

themushroompirates 2 meses atrás
pai
commit
1c39d47b5b

+ 1 - 0
examples/Makefile

@@ -566,6 +566,7 @@ SHAPES = \
     shapes/shapes_ring_drawing \
     shapes/shapes_ring_drawing \
     shapes/shapes_rounded_rectangle_drawing \
     shapes/shapes_rounded_rectangle_drawing \
     shapes/shapes_splines_drawing \
     shapes/shapes_splines_drawing \
+    shapes/shapes_starfield \
     shapes/shapes_top_down_lights \
     shapes/shapes_top_down_lights \
     shapes/shapes_triangle_strip \
     shapes/shapes_triangle_strip \
     shapes/shapes_vector_angle
     shapes/shapes_vector_angle

+ 1 - 0
examples/Makefile.Web

@@ -566,6 +566,7 @@ SHAPES = \
     shapes/shapes_ring_drawing \
     shapes/shapes_ring_drawing \
     shapes/shapes_rounded_rectangle_drawing \
     shapes/shapes_rounded_rectangle_drawing \
     shapes/shapes_splines_drawing \
     shapes/shapes_splines_drawing \
+    shapes/shapes_starfield \
     shapes/shapes_top_down_lights \
     shapes/shapes_top_down_lights \
     shapes/shapes_triangle_strip \
     shapes/shapes_triangle_strip \
     shapes/shapes_vector_angle
     shapes/shapes_vector_angle

+ 2 - 1
examples/README.md

@@ -67,7 +67,7 @@ Examples using raylib[core](../src/rcore.c) platform functionality like window c
 | [core_input_actions](core/core_input_actions.c) | <img src="core/core_input_actions.png" alt="core_input_actions" width="80"> | ⭐⭐☆☆ | 5.5 | 5.6 | [Jett](https://github.com/JettMonstersGoBoom) |
 | [core_input_actions](core/core_input_actions.c) | <img src="core/core_input_actions.png" alt="core_input_actions" width="80"> | ⭐⭐☆☆ | 5.5 | 5.6 | [Jett](https://github.com/JettMonstersGoBoom) |
 | [core_directory_files](core/core_directory_files.c) | <img src="core/core_directory_files.png" alt="core_directory_files" width="80"> | ⭐☆☆☆ | 5.5 | 5.6 | [Hugo ARNAL](https://github.com/hugoarnal) |
 | [core_directory_files](core/core_directory_files.c) | <img src="core/core_directory_files.png" alt="core_directory_files" width="80"> | ⭐☆☆☆ | 5.5 | 5.6 | [Hugo ARNAL](https://github.com/hugoarnal) |
 
 
-### category: shapes [26]
+### category: shapes [27]
 
 
 Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.
 Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.
 
 
@@ -93,6 +93,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes](
 | [shapes_top_down_lights](shapes/shapes_top_down_lights.c) | <img src="shapes/shapes_top_down_lights.png" alt="shapes_top_down_lights" width="80"> | ⭐⭐⭐⭐️ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
 | [shapes_top_down_lights](shapes/shapes_top_down_lights.c) | <img src="shapes/shapes_top_down_lights.png" alt="shapes_top_down_lights" width="80"> | ⭐⭐⭐⭐️ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
 | [shapes_rectangle_advanced](shapes/shapes_rectangle_advanced.c) | <img src="shapes/shapes_rectangle_advanced.png" alt="shapes_rectangle_advanced" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.5 | [Everton Jr.](https://github.com/evertonse) |
 | [shapes_rectangle_advanced](shapes/shapes_rectangle_advanced.c) | <img src="shapes/shapes_rectangle_advanced.png" alt="shapes_rectangle_advanced" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.5 | [Everton Jr.](https://github.com/evertonse) |
 | [shapes_splines_drawing](shapes/shapes_splines_drawing.c) | <img src="shapes/shapes_splines_drawing.png" alt="shapes_splines_drawing" width="80"> | ⭐⭐⭐☆ | 5.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
 | [shapes_splines_drawing](shapes/shapes_splines_drawing.c) | <img src="shapes/shapes_splines_drawing.png" alt="shapes_splines_drawing" width="80"> | ⭐⭐⭐☆ | 5.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
+| [shapes_starfield](shapes/shapes_starfield.c) | <img src="shapes/shapes_starfield.png" alt="shapes_starfield" width="80"> | ⭐⭐⭐☆ | 5.5 | 5.5 | [JP Mortiboys](https://github.com/themushroompirates) |
 | [shapes_digital_clock](shapes/shapes_digital_clock.c) | <img src="shapes/shapes_digital_clock.png" alt="shapes_digital_clock" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.6 | [Hamza RAHAL](https://github.com/hmz-rhl) |
 | [shapes_digital_clock](shapes/shapes_digital_clock.c) | <img src="shapes/shapes_digital_clock.png" alt="shapes_digital_clock" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.6 | [Hamza RAHAL](https://github.com/hmz-rhl) |
 | [shapes_double_pendulum](shapes/shapes_double_pendulum.c) | <img src="shapes/shapes_double_pendulum.png" alt="shapes_double_pendulum" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [JoeCheong](https://github.com/Joecheong2006) |
 | [shapes_double_pendulum](shapes/shapes_double_pendulum.c) | <img src="shapes/shapes_double_pendulum.png" alt="shapes_double_pendulum" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [JoeCheong](https://github.com/Joecheong2006) |
 | [shapes_dashed_line](shapes/shapes_dashed_line.c) | <img src="shapes/shapes_dashed_line.png" alt="shapes_dashed_line" width="80"> | ⭐☆☆☆ | 5.5 | 5.5 | [Luís Almeida](https://github.com/luis605) |
 | [shapes_dashed_line](shapes/shapes_dashed_line.c) | <img src="shapes/shapes_dashed_line.png" alt="shapes_dashed_line" width="80"> | ⭐☆☆☆ | 5.5 | 5.5 | [Luís Almeida](https://github.com/luis605) |

+ 143 - 0
examples/shapes/shapes_starfield.c

@@ -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;
+}

BIN
examples/shapes/shapes_starfield.png