Blood particles

This commit is contained in:
2024-02-10 13:58:42 +01:00
parent 5a66d6ad12
commit 062383407c
3 changed files with 77 additions and 10 deletions

View File

@@ -115,6 +115,32 @@ static ParticleEmitter GET_FIREBALL_EMITTER() {
.data.blend = BLEND_ADDITIVE .data.blend = BLEND_ADDITIVE
}; };
} }
static ParticleEmitter GET_BLOOD_EMITTER() {
return (ParticleEmitter) {
.emitterLifetime = 0.3f,
.data.emmitRate = 1.8f,
.data.minOffset = { -3.6f, -3.6f },
.data.maxOffset = { 3.6f, 3.6f },
.data.minStartVel = { 4.5f, 7.3f },
.data.maxStartVel = { 2.5f, 3.3f },
.data.minEndVel = { -0.8f, 1.2f },
.data.maxEndVel = { -0.4f, 1.6f },
.data.minStartSize = 2.45f,
.data.maxStartSize = 3.3f,
.data.minEndSize = 0.8f,
.data.maxEndSize = 1.1f,
.data.minStartRotSpeed = 8.0f,
.data.maxStartRotSpeed = 14.0f,
.data.minEndRotSpeed = 4.5f,
.data.maxEndRotSpeed = 6.2f,
.data.startColor = { 210, 0, 0, 255 },
.data.endColor = { 110, 10, 10, 32 },
.data.minLifetime = 0.23,
.data.maxLifetime = 0.37,
.data.blend = BLEND_ALPHA,
.data.tileID = getParticleTypeTile(PARTICLE_SMALL_SQUARE),
};
}
typedef struct Particle { typedef struct Particle {
Vector2 pos; Vector2 pos;

View File

@@ -464,6 +464,7 @@ static void drawOverScreen(Color c) {
DrawRectangle(0, 0, width, height, c); DrawRectangle(0, 0, width, height, c);
} }
static ParticleEmitter editedEmitter;
static void renderGame(Game *game, float dt) { static void renderGame(Game *game, float dt) {
ClearBackground(RAYWHITE); ClearBackground(RAYWHITE);
BeginMode2D(game->camera); BeginMode2D(game->camera);
@@ -568,9 +569,15 @@ static void renderGame(Game *game, float dt) {
EndMode2D(); EndMode2D();
static bool firstRun = true;
if (firstRun) {
editedEmitter = GET_BLOOD_EMITTER();
firstRun = false;
}
InputState *input = ecs_singleton_get_mut(ECS, InputState); InputState *input = ecs_singleton_get_mut(ECS, InputState);
if (IsKeyReleased(KEY_SPACE)) { if (IsKeyReleased(KEY_SPACE)) {
ParticleEmitter emitter = GET_FIREBALL_EMITTER(); ParticleEmitter emitter = editedEmitter;
emitter.pos = input->mouseWorld; emitter.pos = input->mouseWorld;
emitter.targetParticles = ecs_id(ParticleLayer1); emitter.targetParticles = ecs_id(ParticleLayer1);
ecs_entity_t e = entityCreateEmpty(); ecs_entity_t e = entityCreateEmpty();
@@ -715,11 +722,14 @@ void imguiRender(float dt, void *userData) {
} }
igText("Input state: %s", inputState); igText("Input state: %s", inputState);
if (igCollapsingHeader_TreeNodeFlags("ParticleEditor", 0)) { if (igCollapsingHeader_TreeNodeFlags("ParticleEditor", 0)) {
static ParticleEmitter emitter = {0.0f}; struct ParticleEmitterData *data = &editedEmitter.data;
emitter.data.tileID = getParticleTypeTile(PARTICLE_CIRCLE); igSliderFloat("EmitterLifetime", &editedEmitter.emitterLifetime, 0.0f, 10.0f, "%.2f", 0);
emitter.data.blend = BLEND_ADDITIVE; igSliderFloat2("Pos", &editedEmitter.pos.x, 0.0f, 1000.0f, "%.2f", 0);
struct ParticleEmitterData *data = &emitter.data;
igSliderFloat2("Pos", &emitter.pos.x, 0.0f, 1000.0f, "%.2f", 0); igSliderFloat("emmitRate", &data->emmitRate, 0.0f, 10.0f, "%.2f", 0);
igSliderFloat("emmitVarianceScl", &data->emmitVariance, 0.0f, 10.0f, "%.2f", 0);
igSliderFloat2("emmitVariance", &data->emmitVarianceMin, -10.0f, 10.0f, "%.2f", 0);
igSliderFloat2("minOffset", &data->minOffset.x, -50.0f, 50.0f, "%.2f", 0); igSliderFloat2("minOffset", &data->minOffset.x, -50.0f, 50.0f, "%.2f", 0);
igSliderFloat2("maxOffset", &data->maxOffset.x, -50.0f, 50.0f, "%.2f", 0); igSliderFloat2("maxOffset", &data->maxOffset.x, -50.0f, 50.0f, "%.2f", 0);
@@ -760,10 +770,31 @@ void imguiRender(float dt, void *userData) {
igSliderFloat("minLifetime", &data->minLifetime, 0.0f, 6.0f, "%.2f", 0); igSliderFloat("minLifetime", &data->minLifetime, 0.0f, 6.0f, "%.2f", 0);
igSliderFloat("maxLifetime", &data->maxLifetime, 0.0f, 6.0f, "%.2f", 0); igSliderFloat("maxLifetime", &data->maxLifetime, 0.0f, 6.0f, "%.2f", 0);
Particle particle = spawnParticle(&emitter);
//ecs_entity_t e = entityCreateEmpty(); #define NUM_BLEND_MODES 6
//ecs_set_ptr(ECS, e, ParticleLayer1, &particle); const char *blendModeNames[NUM_BLEND_MODES] = {
} "Alpha",
"Additive",
"Multiplied",
"AddColors",
"SubtractColors",
"AlphaPremultiply"
};
int blendMode = data->blend;
igCombo_Str_arr("BlendMode", &blendMode, blendModeNames, NUM_BLEND_MODES, 0);
data->blend = blendMode;
#undef NUM_BLEND_MODES
#define NUM_SHAPES 3
const char *typeNames[NUM_SHAPES] = {
"Circle",
"SmallSquare",
"Square",
};
int type = getParticleType(data->tileID);
igCombo_Str_arr("ParticleType", &type, typeNames, NUM_SHAPES, 0);
data->tileID = getParticleTypeTile(type);
#undef NUM_SHAPES
};
if (igCollapsingHeader_TreeNodeFlags("Selection", 0)) { if (igCollapsingHeader_TreeNodeFlags("Selection", 0)) {
switch (input->state) { switch (input->state) {
case INPUT_SELECTED_UNITS: case INPUT_SELECTED_UNITS:

View File

@@ -12,6 +12,16 @@ void damageEvent(ecs_entity_t entity, DamageEvent event) {
Health *health = ecs_get_mut(ECS, entity, Health); Health *health = ecs_get_mut(ECS, entity, Health);
health->hp -= event.amount; health->hp -= event.amount;
Vector2 center = {
event.hitbox.x + event.hitbox.width * 0.5f,
event.hitbox.y + event.hitbox.height * 0.5f,
};
ecs_entity_t bloodEmitterEntity = entityCreateEmpty();
ParticleEmitter bloodEmitter = GET_BLOOD_EMITTER();
bloodEmitter.pos = center;
bloodEmitter.targetParticles = ecs_id(ParticleLayer1);
ecs_set_ptr(ECS, bloodEmitterEntity, ParticleEmitter, &bloodEmitter);
Vector2 pos = { Vector2 pos = {
event.hitbox.x + event.hitbox.width * 0.5f + randFloatRange(-2, 2), event.hitbox.x + event.hitbox.width * 0.5f + randFloatRange(-2, 2),
event.hitbox.y + randFloatRange(2, 4) event.hitbox.y + randFloatRange(2, 4)