From 3e5876d6a5092c410d645fb792d9f6c4bd582bd8 Mon Sep 17 00:00:00 2001 From: zerohorsepower Date: Mon, 29 Sep 2025 23:05:10 -0300 Subject: [PATCH 1/2] add shapes_bullet_hell example --- examples/Makefile | 1 + examples/Makefile.Web | 4 + examples/README.md | 1 + examples/examples_list.txt | 1 + examples/shapes/shapes_bullet_hell.c | 286 +++++++++++++++++++++++++ examples/shapes/shapes_bullet_hell.png | Bin 0 -> 38660 bytes 6 files changed, 293 insertions(+) create mode 100644 examples/shapes/shapes_bullet_hell.c create mode 100644 examples/shapes/shapes_bullet_hell.png diff --git a/examples/Makefile b/examples/Makefile index 36faed3b322c..de02ae0858d7 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -541,6 +541,7 @@ CORE = \ SHAPES = \ shapes/shapes_basic_shapes \ shapes/shapes_bouncing_ball \ + shapes/shapes_bullet_hell \ shapes/shapes_circle_sector_drawing \ shapes/shapes_collision_area \ shapes/shapes_colors_palette \ diff --git a/examples/Makefile.Web b/examples/Makefile.Web index b1b1f0779706..8c9707274276 100644 --- a/examples/Makefile.Web +++ b/examples/Makefile.Web @@ -541,6 +541,7 @@ CORE = \ SHAPES = \ shapes/shapes_basic_shapes \ shapes/shapes_bouncing_ball \ + shapes/shapes_bullet_hell \ shapes/shapes_circle_sector_drawing \ shapes/shapes_collision_area \ shapes/shapes_colors_palette \ @@ -807,6 +808,9 @@ shapes/shapes_basic_shapes: shapes/shapes_basic_shapes.c shapes/shapes_bouncing_ball: shapes/shapes_bouncing_ball.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) +shapes/shapes_bullet_hell: shapes/shapes_bullet_hell.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) + shapes/shapes_circle_sector_drawing: shapes/shapes_circle_sector_drawing.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) diff --git a/examples/README.md b/examples/README.md index 48e83c85298c..6c17f3bdbfbf 100644 --- a/examples/README.md +++ b/examples/README.md @@ -72,6 +72,7 @@ Examples using raylib shapes drawing functionality, provided by raylib [shapes]( |-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------| | [shapes_basic_shapes](shapes/shapes_basic_shapes.c) | shapes_basic_shapes | ⭐☆☆☆ | 1.0 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) | | [shapes_bouncing_ball](shapes/shapes_bouncing_ball.c) | shapes_bouncing_ball | ⭐☆☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) | +| [shapes_bullet_hell](shapes/shapes_bullet_hell.c) | shapes_bullet_hell | ⭐☆☆☆ | 5.6 | 5.6 | [Zero](https://github.com/zerohorsepower) | | [shapes_colors_palette](shapes/shapes_colors_palette.c) | shapes_colors_palette | ⭐⭐☆☆ | 1.0 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) | | [shapes_logo_raylib](shapes/shapes_logo_raylib.c) | shapes_logo_raylib | ⭐☆☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) | | [shapes_logo_raylib_anim](shapes/shapes_logo_raylib_anim.c) | shapes_logo_raylib_anim | ⭐⭐☆☆ | 2.5 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) | diff --git a/examples/examples_list.txt b/examples/examples_list.txt index b5682123f63c..6af9bb6ebef4 100644 --- a/examples/examples_list.txt +++ b/examples/examples_list.txt @@ -47,6 +47,7 @@ core;core_undo_redo;★★★☆;5.5;5.6;2025;2025;"Ramon Santamaria";@raysan5 core;core_input_actions;★★☆☆;5.5;5.6;2025;2025;"Jett";@JettMonstersGoBoom shapes;shapes_basic_shapes;★☆☆☆;1.0;4.2;2014;2025;"Ramon Santamaria";@raysan5 shapes;shapes_bouncing_ball;★☆☆☆;2.5;2.5;2013;2025;"Ramon Santamaria";@raysan5 +shapes;shapes_bullet_hell;★☆☆☆;5.6;5.6;2025;2025;"Zero";@zerohorsepower shapes;shapes_colors_palette;★★☆☆;1.0;2.5;2014;2025;"Ramon Santamaria";@raysan5 shapes;shapes_logo_raylib;★☆☆☆;1.0;1.0;2014;2025;"Ramon Santamaria";@raysan5 shapes;shapes_logo_raylib_anim;★★☆☆;2.5;4.0;2014;2025;"Ramon Santamaria";@raysan5 diff --git a/examples/shapes/shapes_bullet_hell.c b/examples/shapes/shapes_bullet_hell.c new file mode 100644 index 000000000000..011be9e846be --- /dev/null +++ b/examples/shapes/shapes_bullet_hell.c @@ -0,0 +1,286 @@ +/******************************************************************************************* +* +* raylib [shapes] example - bullet hell +* +* Example complexity rating: [★☆☆☆] 1/4 +* +* Example originally created with raylib 5.6, last time updated with raylib 5.6 +* +* Example contributed by Zero (@zerohorsepower) 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-2025 Zero (@zerohorsepower) +* +********************************************************************************************/ + +#include "raylib.h" +#include // Required for: malloc(), free() +#include // Required for: cosf(), sinf() + +#define MAX_BULLETS 500000 // Max bullets that 800x450 can keep on minimum settings is 130.000 bullets + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef struct Bullet { + Vector2 position; + Vector2 acceleration; // the amount of pixels to be incremented to position every frame + bool disabled; // skip processing and draw case out of screen + Color color; +} Bullet; + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [shapes] example - bullet hell"); + + // Bullet + Bullet *bullets = (Bullet *)malloc(MAX_BULLETS*sizeof(Bullet)); // Bullets array + int bulletCount = 0; + int bulletDisabledCount = 0; // Used to calculate how many bullets are on screen + int bulletRadius = 10; + float bulletSpeed = 3.0f; + int bulletRows = 6; + Color bulletColor[2] = { RED, BLUE }; + + // Spawner + float baseDirection = 0; + int angleIncrement = 5; // After spawn all bullet rows, increment this value on the baseDirection for next the frame + float spawnCooldown = 2; + float spawnCooldownTimer = spawnCooldown; + + // Magic circle + float magicCircleRotation = 0; + + // Used on performance drawing + RenderTexture bulletTexture = LoadRenderTexture(24, 24); + + // Draw circle to bullet texture, then draw bullet using DrawTexture() + // This is being done to improve the performance, since DrawCircle() is slow + BeginDrawing(); + BeginTextureMode(bulletTexture); + DrawCircle(12, 12, bulletRadius, WHITE); + DrawCircleLines(12, 12, bulletRadius, BLACK); + EndTextureMode(); + EndDrawing(); + + bool drawInPerformanceMode = true; + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + + // Reset the bullet index + // New bullets will replace the old ones that are already disabled due to out-of-screen + if (bulletCount >= MAX_BULLETS) + { + bulletCount = 0; + bulletDisabledCount = 0; + } + + spawnCooldownTimer--; + if (spawnCooldownTimer < 0) + { + spawnCooldownTimer = spawnCooldown; + + // Spawn bullets + float degreesPerRow = 360.0f / bulletRows; + for (int row = 0; row < bulletRows; row++) + { + + if (bulletCount < MAX_BULLETS) + { + + bullets[bulletCount].position = (Vector2){(float) screenWidth/2, (float) screenHeight/2}; + bullets[bulletCount].disabled = false; + bullets[bulletCount].color = bulletColor[row % 2]; + + float bulletDirection = baseDirection + (degreesPerRow * row); + + // bullet speed * bullet direction, this will determine how much pixels will be incremented/decremented + // from the bullet position every frame. Since the bullets doesn't change its direction and speed, + // only need to calculate it at the spawning time. + // 0 degrees = right, 90 degrees = down, 180 degrees = left and 270 degrees = up, basically clockwise. + // Case you want it to be anti-clockwise, add "* -1" at the y acceleration + bullets[bulletCount].acceleration = (Vector2){ + bulletSpeed * cosf(bulletDirection * DEG2RAD), + bulletSpeed * sinf(bulletDirection * DEG2RAD) + }; + + bulletCount++; + } + } + + baseDirection += angleIncrement; + + } + + + // Update bullets position based on its acceleration + for (int i = 0; i < bulletCount; i++) + { + + // Only update bullet if inside the screen + if (!bullets[i].disabled) + { + + bullets[i].position.x += bullets[i].acceleration.x; + bullets[i].position.y += bullets[i].acceleration.y; + + // Disable bullet if out of screen + if + ( + bullets[i].position.x < -bulletRadius*2 || + bullets[i].position.x > screenWidth + bulletRadius*2 || + bullets[i].position.y < -bulletRadius*2 || + bullets[i].position.y > screenHeight + bulletRadius*2 + ) + { + bullets[i].disabled = true; + bulletDisabledCount++; + } + } + } + + // Input + if ((IsKeyPressed(KEY_RIGHT) || IsKeyPressed(KEY_D)) && bulletRows < 359) bulletRows++; + if ((IsKeyPressed(KEY_LEFT) || IsKeyPressed(KEY_A)) && bulletRows > 1) bulletRows--; + if (IsKeyPressed(KEY_UP) || IsKeyPressed(KEY_W)) bulletSpeed += 0.25f; + if ((IsKeyPressed(KEY_DOWN) || IsKeyPressed(KEY_S)) && bulletSpeed > 0.50f) bulletSpeed -= 0.25f; + if (IsKeyPressed(KEY_Z) && spawnCooldown > 1) spawnCooldown--; + if (IsKeyPressed(KEY_X)) spawnCooldown++; + if (IsKeyPressed(KEY_ENTER)) drawInPerformanceMode = !drawInPerformanceMode; + + if (IsKeyDown(KEY_SPACE)) + { + angleIncrement += 1; + angleIncrement %= 360; + } + + if (IsKeyPressed(KEY_C)) + { + bulletCount = 0; + bulletDisabledCount = 0; + } + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + // Draw magic circle + magicCircleRotation++; + DrawRectanglePro( + (Rectangle) { (float) screenWidth/2, (float) screenHeight/2, 120, 120 }, + (Vector2) { 60, 60 }, + magicCircleRotation, + PURPLE + ); + DrawRectanglePro( + (Rectangle) { (float) screenWidth/2, (float) screenHeight/2, 120, 120 }, + (Vector2) { 60, 60 }, + magicCircleRotation + 45, + PURPLE + ); + DrawCircleLines(screenWidth/2, screenHeight/2, 70, BLACK); + DrawCircleLines(screenWidth/2, screenHeight/2, 50, BLACK); + DrawCircleLines(screenWidth/2, screenHeight/2, 30, BLACK); + + + // Draw bullets + // DrawInPerformanceMode = draw bullets using DrawTexture, DrawCircle is vary slow + if (drawInPerformanceMode) + { + for (int i = 0; i < bulletCount; i++) + { + // Do not draw disabled bullets (out of screen) + if (!bullets[i].disabled) + { + DrawTexture( + bulletTexture.texture, + bullets[i].position.x - bulletTexture.texture.width*0.5f, + bullets[i].position.y - bulletTexture.texture.height*0.5f, + bullets[i].color + ); + } + } + } else { + + for (int i = 0; i < bulletCount; i++) + { + // Do not draw disabled bullets (out of screen) + if (!bullets[i].disabled) + { + DrawCircleV(bullets[i].position, bulletRadius, bullets[i].color); + DrawCircleLinesV(bullets[i].position, bulletRadius, BLACK); + } + } + } + + // Draw UI + DrawRectangle(10, 10, 280, 150, (Color){0,0, 0, 200 }); + DrawText("Controls:", 20, 20, 10, LIGHTGRAY); + DrawText("- Right/Left or A/D: Change rows number", 40, 40, 10, LIGHTGRAY); + DrawText("- Up/Down or W/S: Change bullet speed", 40, 60, 10, LIGHTGRAY); + DrawText("- Z or X: Change spawn cooldown", 40, 80, 10, LIGHTGRAY); + DrawText("- Space (Hold): Change the angle increment", 40, 100, 10, LIGHTGRAY); + DrawText("- Enter: Switch draw method (Performance)", 40, 120, 10, LIGHTGRAY); + DrawText("- C: Clear bullets", 40, 140, 10, LIGHTGRAY); + + DrawRectangle(610, 10, 170, 30, (Color){0,0, 0, 200 }); + if (drawInPerformanceMode) + { + DrawText("Draw method: DrawTexture(*)", 620, 20, 10, GREEN); + } else { + DrawText("Draw method: DrawCircle(*)", 620, 20, 10, RED); + } + + + DrawRectangle(135, 410, 530, 30, (Color){0,0, 0, 200 }); + DrawText( + TextFormat( + "[ FPS: %d, Bullets: %d, Rows: %d, Bullet speed: %.2f, Angle increment per frame: %d, Cooldown: %.0f ]", + GetFPS(), bulletCount - bulletDisabledCount, bulletRows, bulletSpeed, angleIncrement, spawnCooldown + ), + 155, + 420, + 10, + GREEN + ); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + + UnloadRenderTexture(bulletTexture); + + free(bullets); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/shapes/shapes_bullet_hell.png b/examples/shapes/shapes_bullet_hell.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8e5d8f638b7ef0ef5d4269cbdae98a6c2d945a GIT binary patch literal 38660 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 Sv)Ds0@bmQ!@VY|dWc&|@=gc?& literal 0 HcmV?d00001 From 9209a20629396aa5e2976899cd2a2025ddbbd675 Mon Sep 17 00:00:00 2001 From: zerohorsepower Date: Mon, 29 Sep 2025 23:09:58 -0300 Subject: [PATCH 2/2] adjust example count --- examples/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/README.md b/examples/README.md index 6c17f3bdbfbf..92ea9aa07fb5 100644 --- a/examples/README.md +++ b/examples/README.md @@ -17,7 +17,7 @@ You may find it easier to use than other toolchains, especially when it comes to - `zig build [module]` to compile all examples for a module (e.g. `zig build core`) - `zig build [example]` to compile _and run_ a particular example (e.g. `zig build core_basic_window`) -## EXAMPLES COLLECTION [TOTAL: 164] +## EXAMPLES COLLECTION [TOTAL: 165] ### category: core [38] @@ -64,7 +64,7 @@ Examples using raylib[core](../src/rcore.c) platform functionality like window c | [core_undo_redo](core/core_undo_redo.c) | core_undo_redo | ⭐⭐⭐☆ | 5.5 | 5.6 | [Ramon Santamaria](https://github.com/raysan5) | | [core_input_actions](core/core_input_actions.c) | core_input_actions | ⭐⭐☆☆ | 5.5 | 5.6 | [Jett](https://github.com/JettMonstersGoBoom) | -### category: shapes [20] +### category: shapes [21] Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.