| ⭐⭐☆☆ | 5.5 | 5.6 | [Jett](https://github.com/JettMonstersGoBoom) |
| [core_directory_files](core/core_directory_files.c) |
| ⭐☆☆☆ | 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.
@@ -93,6 +93,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes](
| [shapes_top_down_lights](shapes/shapes_top_down_lights.c) |
| ⭐⭐⭐⭐️ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
| [shapes_rectangle_advanced](shapes/shapes_rectangle_advanced.c) |
| ⭐⭐⭐⭐️ | 5.5 | 5.5 | [Everton Jr.](https://github.com/evertonse) |
| [shapes_splines_drawing](shapes/shapes_splines_drawing.c) |
| ⭐⭐⭐☆ | 5.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
+| [shapes_starfield](shapes/shapes_starfield.c) |
| ⭐⭐⭐☆ | 5.5 | 5.5 | [JP Mortiboys](https://github.com/themushroompirates) |
| [shapes_digital_clock](shapes/shapes_digital_clock.c) |
| ⭐⭐⭐⭐️ | 5.5 | 5.6 | [Hamza RAHAL](https://github.com/hmz-rhl) |
| [shapes_double_pendulum](shapes/shapes_double_pendulum.c) |
| ⭐⭐☆☆ | 5.5 | 5.5 | [JoeCheong](https://github.com/Joecheong2006) |
| [shapes_dashed_line](shapes/shapes_dashed_line.c) |
| ⭐☆☆☆ | 5.5 | 5.5 | [Luís Almeida](https://github.com/luis605) |
diff --git a/examples/shapes/shapes_starfield.c b/examples/shapes/shapes_starfield.c
new file mode 100644
index 000000000..457912dec
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/examples/shapes/shapes_starfield.png b/examples/shapes/shapes_starfield.png
new file mode 100644
index 0000000000000000000000000000000000000000..6903f222b5e0e25b22be5717b79da5b66f6503d5
GIT binary patch
literal 20913
zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8XZ#=yWJp1k%114Ceir;B4qMO<>q1e3q#
z4Y=H#6HHjJ6AgTd2TY_+Emky;V!}>1tQU}Y+t9OY>qP+x-bO40W7|c(6B$a_B|#d>
z6b-DHjb^QIcTQkwJ#gKc-R*HThI`mdSlp}?7IPM0$Uq(5kf+$NmD$M3%W4*ryK_QC
z8^iW4=EE8Pj{Ue)j%S##Lo
zhUKjEHaAF<> l5Xt^UF@{i210ZgiVB#{ny)4JN(o|61*0$rd>N>&2Hh
z2i(rR$gnLvTyJ9Iu6+}{r9D77zxSE{n?mRF1(LnZ7lo26+8EZA*xq84Y}sgg>!ZXE
z56QJ0Zr1XPLmy^v@GKQru;q-D?q@dloc?S77e77c!3i2~Q0RJju_^sS2*YCUb)ZSa
zs}C|bdbS80xXLN{cFqNR)tQc(V~k-V4WRja~6lW6D}TPIP+t1+Vh+pZ6CotLz-DK
zQ8cicWi?B}-8ta}s1e3et==;0q0ybRIiN