Prevent asteroids from spawning overlapped

This commit is contained in:
2025-10-18 17:43:22 +01:00
parent 4ce86ec405
commit a1f289ef9d

37
game.c
View File

@@ -144,7 +144,7 @@ static void shoot()
memcpy(s->verts, shot_verts, sizeof(shot_verts));
}
static entity_t *gen_asteroid(float r_mean)
static entity_t *gen_asteroid(float r_mean, unsigned *id_out)
{
unsigned id;
entity_t *e = add_entity(&id);
@@ -168,9 +168,28 @@ static entity_t *gen_asteroid(float r_mean)
s->verts[i] = (vec2_t) { r * cosf(a), r * sinf(a) };
}
if (id_out)
*id_out = id;
return e;
}
static bool intersecting(unsigned a, unsigned b)
{
const float sep = vec2_len(vec2_sub(entities[b].pos, entities[a].pos));
return sep <= entities[a].radius + entities[b].radius;
}
static bool intersecting_any(unsigned id)
{
for (unsigned i = 0; i < entity_count; ++i) {
if (i == id)
continue;
if (intersecting(id, i))
return true;
}
return false;
}
static void spawn_asteroid()
{
float r;
@@ -182,11 +201,12 @@ static void spawn_asteroid()
else
r = ASTEROID_LARGE;
entity_t *e = gen_asteroid(r);
unsigned id;
entity_t *e = gen_asteroid(r, &id);
do {
e->pos.y = rng_plusminus();
e->pos.x = aspect * rng_plusminus();
} while (vec2_len(e->pos) < ASTEROID_MIN_DIST);
} while (vec2_len(e->pos) < ASTEROID_MIN_DIST || intersecting_any(id));
e->vel = (vec2_t) {
ASTEROID_VEL_JITTER * rng_plusminus(),
ASTEROID_VEL_JITTER * rng_plusminus(),
@@ -246,15 +266,12 @@ 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->radius + b->radius) {
if (intersecting(i, j)) {
assert(count < MAX_COLLISIONS);
collision_t *col = out + count++;
col->entities[0] = i;
col->entities[1] = j;
out[count].entities[0] = i;
out[count].entities[1] = j;
++count;
}
}
}