tinyswords/boids.c

88 lines
3.0 KiB
C

#include "include/raylib.h"
#include "include/raymath.h"
#include <stdio.h>
#include <stdlib.h>
#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();
}