#include "include/raylib.h" #include "include/raymath.h" #include #include #include "lib.h" #define SCREEN_WIDTH 1300 #define SCREEN_HEIGHT 1000 #define TARGET_FPS 60 #define NUM_BOIDS 16 const float max_speed = 200.0f; const float max_force = 0.1; 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, rand_vy * 0.01f}; 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]; 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, 35, BLACK); DrawCircle(boid->position.x, boid->position.y, 25, GREEN); } } EndDrawing(); } free(boids); CloseWindow(); }