Prevent asteroids from spawning overlapped
This commit is contained in:
37
game.c
37
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user