Blood particles
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
51
game/main.c
51
game/main.c
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user