tinyswords/boids.c

79 lines
2.4 KiB
C

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