Implement collision detection

This commit is contained in:
2025-10-18 17:43:22 +01:00
parent 9ed14e07e5
commit 1053d61fda

27
game.c
View File

@@ -36,6 +36,7 @@
#define MAX_SHAPES 256U #define MAX_SHAPES 256U
#define MAX_ENTITIES 128U #define MAX_ENTITIES 128U
#define MAX_SHAPES_PER_ENTITY 2 #define MAX_SHAPES_PER_ENTITY 2
#define MAX_COLLISIONS 128U
#define NELEMS(arr) (sizeof(arr) / sizeof(arr[0])) #define NELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
@@ -65,6 +66,9 @@ typedef struct {
uint8_t flags; uint8_t flags;
} shape_t; } shape_t;
typedef struct {
unsigned entities[2];
} collision_t;
static const vec2_t ship_verts[] = { static const vec2_t ship_verts[] = {
{ 0.0, 0.11 }, { 0.0, 0.11 },
@@ -236,6 +240,25 @@ static void ship_update()
fire->verts[0].y = FIRE_MEAN + FIRE_JITTER * rng_plusminus(); fire->verts[0].y = FIRE_MEAN + FIRE_JITTER * rng_plusminus();
} }
static unsigned check_collisions(collision_t *out)
{
unsigned count = 0;
for (unsigned i = 0; i < entity_count; ++i) {
const entity_t *a = entities + i;
for (unsigned j = i + 1; j < entity_count; ++j) {
const entity_t *b = entities + j;
const float r = vec2_len(vec2_sub(b->pos, a->pos));
if (r <= a->collision_radius + b->collision_radius) {
assert(count < MAX_COLLISIONS);
collision_t *col = out + count++;
col->entities[0] = i;
col->entities[1] = j;
}
}
}
return count;
}
void game_init(float _aspect) void game_init(float _aspect)
{ {
input_on_shoot(shoot); input_on_shoot(shoot);
@@ -267,6 +290,7 @@ void game_init(float _aspect)
void game_update() void game_update()
{ {
ship_update(); ship_update();
for (unsigned i = 0; i < entity_count; ++i) { for (unsigned i = 0; i < entity_count; ++i) {
@@ -294,6 +318,9 @@ void game_update()
transforms[i] transforms[i]
= mat3_mul_mat3(mat3_translation(e->pos), mat2_extend(e->dir)); = mat3_mul_mat3(mat3_translation(e->pos), mat2_extend(e->dir));
} }
static collision_t collisions[MAX_COLLISIONS];
const unsigned ncols = check_collisions(collisions);
} }
void game_draw() void game_draw()