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));
|
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;
|
unsigned id;
|
||||||
entity_t *e = add_entity(&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) };
|
s->verts[i] = (vec2_t) { r * cosf(a), r * sinf(a) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (id_out)
|
||||||
|
*id_out = id;
|
||||||
return e;
|
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()
|
static void spawn_asteroid()
|
||||||
{
|
{
|
||||||
float r;
|
float r;
|
||||||
@@ -182,11 +201,12 @@ static void spawn_asteroid()
|
|||||||
else
|
else
|
||||||
r = ASTEROID_LARGE;
|
r = ASTEROID_LARGE;
|
||||||
|
|
||||||
entity_t *e = gen_asteroid(r);
|
unsigned id;
|
||||||
|
entity_t *e = gen_asteroid(r, &id);
|
||||||
do {
|
do {
|
||||||
e->pos.y = rng_plusminus();
|
e->pos.y = rng_plusminus();
|
||||||
e->pos.x = aspect * 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) {
|
e->vel = (vec2_t) {
|
||||||
ASTEROID_VEL_JITTER * rng_plusminus(),
|
ASTEROID_VEL_JITTER * rng_plusminus(),
|
||||||
ASTEROID_VEL_JITTER * rng_plusminus(),
|
ASTEROID_VEL_JITTER * rng_plusminus(),
|
||||||
@@ -246,15 +266,12 @@ static unsigned check_collisions(collision_t *out)
|
|||||||
{
|
{
|
||||||
unsigned count = 0;
|
unsigned count = 0;
|
||||||
for (unsigned i = 0; i < entity_count; ++i) {
|
for (unsigned i = 0; i < entity_count; ++i) {
|
||||||
const entity_t *a = entities + i;
|
|
||||||
for (unsigned j = i + 1; j < entity_count; ++j) {
|
for (unsigned j = i + 1; j < entity_count; ++j) {
|
||||||
const entity_t *b = entities + j;
|
if (intersecting(i, j)) {
|
||||||
const float r = vec2_len(vec2_sub(b->pos, a->pos));
|
|
||||||
if (r <= a->radius + b->radius) {
|
|
||||||
assert(count < MAX_COLLISIONS);
|
assert(count < MAX_COLLISIONS);
|
||||||
collision_t *col = out + count++;
|
out[count].entities[0] = i;
|
||||||
col->entities[0] = i;
|
out[count].entities[1] = j;
|
||||||
col->entities[1] = j;
|
++count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user