#include "include/raylib.h" #include "include/raymath.h" #include #include #include "lib.h" #define SCREEN_WIDTH 1024 #define SCREEN_HEIGHT 768 #define TARGET_FPS 60 #define NUM_BOIDS 16 const float max_speed = 5.0f; const float max_force = 0.05; typedef struct Boid { Point position; Vector2 acceleration; Vector2 velocity; } Boid; int main(void) { InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Boids"); SetTargetFPS(TARGET_FPS); Boid *boids = calloc(NUM_BOIDS, sizeof(Boid)); for (int i = 0; i < NUM_BOIDS; i++) { Boid *boid = &boids[i]; int rand_x = GetRandomValue(0, SCREEN_WIDTH); int rand_y = GetRandomValue(0, SCREEN_HEIGHT); boid->position = (Vector2){rand_x, rand_y}; int rand_vx = GetRandomValue(0, 100); int rand_vy = GetRandomValue(0, 100); boid->velocity = (Vector2){rand_vx * 0.01f - 0.5f, rand_vy * 0.01f - 0.5f}; boid->velocity = Vector2Scale(boid->velocity, 10.0f); // int rand_ax = GetRandomValue(0, 100); // int rand_ay = GetRandomValue(0, 100); // boid->velocity = (Vector2){rand_ax * 0.01f - 0.5f, rand_ay * 0.01f - 0.5f}; } PointOption target_pos = {0}; while (!WindowShouldClose()) { float dt = GetFrameTime(); // Update if (IsMouseButtonPressed(0)) { Vector2 mouse_pos = GetMousePosition(); target_pos = (PointOption){.tag = SOME, .some.point = mouse_pos}; } for (int i = 0; i < NUM_BOIDS; i++) { Boid *boid = &boids[i]; if (target_pos.tag == SOME) { Vector2 desired = Vector2Subtract(target_pos.some.point, boid->position); desired = Vector2Normalize(desired); desired = Vector2Scale(desired, max_speed); Vector2 steer = Vector2Subtract(desired, boid->velocity); steer = Vector2ClampValue(steer, 0.0f, max_force); boid->acceleration = Vector2Add(boid->acceleration, steer); } boid->velocity = Vector2Add(boid->velocity, boid->acceleration); boid->velocity = Vector2ClampValue(boid->velocity, 0.0f, max_speed); boid->position = Vector2Add(boid->position, boid->velocity); } BeginDrawing(); { ClearBackground(RAYWHITE); // You can draw a triangle but you'd need to rotate all 3 vectors, and I don't // want to get distracted with that // DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, GREEN); // DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, GREEN); for (int i = 0; i < NUM_BOIDS; i++) { Boid *boid = &boids[i]; DrawCircle(boid->position.x, boid->position.y, 27, BLACK); DrawCircle(boid->position.x, boid->position.y, 20, GREEN); } } EndDrawing(); } free(boids); CloseWindow(); }