diff --git a/game.c b/game.c index 29e9b29..ca2caa3 100644 --- a/game.c +++ b/game.c @@ -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; } } }