Add particle emitter on asteroid destroy
This commit is contained in:
parent
d49811358a
commit
cdf0ed64bf
Binary file not shown.
@ -813,6 +813,22 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory,
|
||||
v2 localDp = V2(math_cosf(rotation), math_sinf(rotation));
|
||||
entity->dP = v2_scale(localDp, world->pixelsPerMeter * 5);
|
||||
}
|
||||
else if (entity->type == entitytype_particle)
|
||||
{
|
||||
f32 diff = entity->color.a - 0.1f;
|
||||
if (diff < 0.01f)
|
||||
{
|
||||
deleteEntity(world, i--);
|
||||
continue;
|
||||
}
|
||||
|
||||
f32 divisor =
|
||||
MAX(entity->particleInitDp.x, entity->particleInitDp.y);
|
||||
f32 maxDp = MAX(entity->dP.x, entity->dP.y);
|
||||
|
||||
entity->color.a = maxDp / divisor;
|
||||
|
||||
}
|
||||
|
||||
/* Loop entity around world */
|
||||
if (entity->pos.y >= world->worldSize.h)
|
||||
@ -852,12 +868,16 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory,
|
||||
if (colliderA->type >= entitytype_asteroid_small &&
|
||||
colliderA->type <= entitytype_asteroid_large)
|
||||
{
|
||||
|
||||
f32 numParticles = 4;
|
||||
if (colliderA->type == entitytype_asteroid_medium)
|
||||
{
|
||||
AsteroidSpec spec = {0};
|
||||
spec.pos = colliderA->pos;
|
||||
spec.dP = v2_scale(colliderA->dP, -2.0f);
|
||||
addAsteroidWithSpec(world, asteroidsize_small, &spec);
|
||||
|
||||
numParticles = 8;
|
||||
}
|
||||
else if (colliderA->type == entitytype_asteroid_large)
|
||||
{
|
||||
@ -871,6 +891,59 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory,
|
||||
|
||||
spec.dP = v2_perpendicular(colliderA->dP);
|
||||
addAsteroidWithSpec(world, asteroidsize_small, &spec);
|
||||
|
||||
numParticles = 16;
|
||||
}
|
||||
|
||||
for (i32 i = 0; i < numParticles; i++)
|
||||
{
|
||||
{ // Add particles
|
||||
Entity *particle =
|
||||
&world->entityList[world->entityIndex++];
|
||||
particle->id = world->entityIdCounter++;
|
||||
|
||||
particle->pos = colliderA->pos;
|
||||
particle->size = V2(4.0f, 4.0f);
|
||||
|
||||
i32 randValue = rand();
|
||||
Radians rotation =
|
||||
DEGREES_TO_RADIANS((randValue % 360));
|
||||
v2 randDirectionVec =
|
||||
V2(math_cosf(rotation), math_sinf(rotation));
|
||||
|
||||
i32 particleDpLimit = 8;
|
||||
f32 randDpMultiplier =
|
||||
(f32)(randValue % particleDpLimit) + 1;
|
||||
|
||||
v2 newDp = v2_scale(colliderA->dP, randDpMultiplier);
|
||||
newDp = v2_hadamard(newDp, randDirectionVec);
|
||||
|
||||
particle->dP = newDp;
|
||||
particle->particleInitDp = newDp;
|
||||
|
||||
particle->offset = v2_scale(particle->size, -0.5f);
|
||||
particle->hitbox = particle->size;
|
||||
particle->rotation = 0;
|
||||
particle->renderMode = rendermode_polygon;
|
||||
|
||||
if (!world->particleVertexCache)
|
||||
{
|
||||
world->particleVertexCache =
|
||||
MEMORY_PUSH_ARRAY(&world->entityArena, 4, v2);
|
||||
world->particleVertexCache[0] =
|
||||
V2(0, particle->size.h);
|
||||
world->particleVertexCache[1] = V2(0, 0);
|
||||
world->particleVertexCache[2] =
|
||||
V2(particle->size.w, 0);
|
||||
world->particleVertexCache[3] = particle->size;
|
||||
}
|
||||
|
||||
particle->vertexPoints = world->particleVertexCache;
|
||||
particle->numVertexPoints = 4;
|
||||
|
||||
particle->type = entitytype_particle;
|
||||
particle->color = V4(1.0f, 0.0f, 0, 1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
ASSERT(colliderB->type == entitytype_bullet);
|
||||
|
@ -25,6 +25,7 @@ typedef struct World
|
||||
v2 *asteroidLargeVertexCache[3];
|
||||
|
||||
v2 *bulletVertexCache;
|
||||
v2 *particleVertexCache;
|
||||
|
||||
// TODO(doyle): Audio mixing instead of multiple renderers
|
||||
AudioRenderer *audioRenderer;
|
||||
|
@ -58,6 +58,8 @@ enum EntityType
|
||||
entitytype_asteroid_medium,
|
||||
entitytype_asteroid_large,
|
||||
|
||||
entitytype_particle,
|
||||
|
||||
entitytype_bullet,
|
||||
entitytype_count,
|
||||
};
|
||||
@ -77,6 +79,7 @@ typedef struct Entity
|
||||
|
||||
v2 pos;
|
||||
v2 dP;
|
||||
v2 particleInitDp;
|
||||
|
||||
v2 hitbox;
|
||||
v2 size;
|
||||
|
Loading…
Reference in New Issue
Block a user