Blood particles
This commit is contained in:
@@ -115,6 +115,32 @@ static ParticleEmitter GET_FIREBALL_EMITTER() {
|
||||
.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 {
|
||||
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);
|
||||
}
|
||||
static ParticleEmitter editedEmitter;
|
||||
static void renderGame(Game *game, float dt) {
|
||||
ClearBackground(RAYWHITE);
|
||||
BeginMode2D(game->camera);
|
||||
@@ -568,9 +569,15 @@ static void renderGame(Game *game, float dt) {
|
||||
|
||||
EndMode2D();
|
||||
|
||||
static bool firstRun = true;
|
||||
if (firstRun) {
|
||||
editedEmitter = GET_BLOOD_EMITTER();
|
||||
firstRun = false;
|
||||
}
|
||||
|
||||
InputState *input = ecs_singleton_get_mut(ECS, InputState);
|
||||
if (IsKeyReleased(KEY_SPACE)) {
|
||||
ParticleEmitter emitter = GET_FIREBALL_EMITTER();
|
||||
ParticleEmitter emitter = editedEmitter;
|
||||
emitter.pos = input->mouseWorld;
|
||||
emitter.targetParticles = ecs_id(ParticleLayer1);
|
||||
ecs_entity_t e = entityCreateEmpty();
|
||||
@@ -715,11 +722,14 @@ void imguiRender(float dt, void *userData) {
|
||||
}
|
||||
igText("Input state: %s", inputState);
|
||||
if (igCollapsingHeader_TreeNodeFlags("ParticleEditor", 0)) {
|
||||
static ParticleEmitter emitter = {0.0f};
|
||||
emitter.data.tileID = getParticleTypeTile(PARTICLE_CIRCLE);
|
||||
emitter.data.blend = BLEND_ADDITIVE;
|
||||
struct ParticleEmitterData *data = &emitter.data;
|
||||
igSliderFloat2("Pos", &emitter.pos.x, 0.0f, 1000.0f, "%.2f", 0);
|
||||
struct ParticleEmitterData *data = &editedEmitter.data;
|
||||
igSliderFloat("EmitterLifetime", &editedEmitter.emitterLifetime, 0.0f, 10.0f, "%.2f", 0);
|
||||
igSliderFloat2("Pos", &editedEmitter.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("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("maxLifetime", &data->maxLifetime, 0.0f, 6.0f, "%.2f", 0);
|
||||
Particle particle = spawnParticle(&emitter);
|
||||
//ecs_entity_t e = entityCreateEmpty();
|
||||
//ecs_set_ptr(ECS, e, ParticleLayer1, &particle);
|
||||
}
|
||||
|
||||
#define NUM_BLEND_MODES 6
|
||||
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)) {
|
||||
switch (input->state) {
|
||||
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->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 = {
|
||||
event.hitbox.x + event.hitbox.width * 0.5f + randFloatRange(-2, 2),
|
||||
event.hitbox.y + randFloatRange(2, 4)
|
||||
|
||||
Reference in New Issue
Block a user