First commit
This commit is contained in:
95
Explosions.cpp
Normal file
95
Explosions.cpp
Normal file
@@ -0,0 +1,95 @@
|
||||
#include "Explosions.h"
|
||||
#include "api.h"
|
||||
|
||||
#define MAX_EXPLOSIONS 5
|
||||
#define PIXELS_PER_EXPLOSION 24
|
||||
#define PARTICLES_PER_EXPLOSION 4
|
||||
struct Particle {
|
||||
Point pos;
|
||||
Point dir;
|
||||
float scale;
|
||||
float angle;
|
||||
};
|
||||
struct Explosion {
|
||||
Point pos;
|
||||
Point dir;
|
||||
float scale;
|
||||
float angle;
|
||||
int ttl;
|
||||
};
|
||||
Explosion explosions[MAX_EXPLOSIONS][PIXELS_PER_EXPLOSION];
|
||||
Particle particles[MAX_EXPLOSIONS][PARTICLES_PER_EXPLOSION];
|
||||
|
||||
Explosions::Explosions() {
|
||||
for (int i = 0; i < MAX_EXPLOSIONS; i++) {
|
||||
explosions[i][0].ttl = 0;
|
||||
}
|
||||
RegisterMessage("GenerateExplosion", this);
|
||||
}
|
||||
|
||||
|
||||
void Explosions::Update() {
|
||||
for (int i = 0; i < MAX_EXPLOSIONS; i++) {
|
||||
if (explosions[i][0].ttl > 0) {
|
||||
for (int j = 0; j < PIXELS_PER_EXPLOSION; j++) {
|
||||
explosions[i][j].pos.x += explosions[i][j].dir.x;
|
||||
explosions[i][j].pos.y += explosions[i][j].dir.y;
|
||||
//SetColor(128+rand()%128, 128+rand()%128, 128+rand()%128);
|
||||
//DrawPoint(explosions[i][j].pos.x, explosions[i][j].pos.y);
|
||||
Tint(128 + rand() % 128, 128 + rand() % 128, 128 + rand() % 128);
|
||||
DrawEx(explosions[i][j].pos.x, explosions[i][j].pos.y, 3, 85, 1, 1, explosions[i][j].scale, explosions[i][j].angle);
|
||||
if (explosions[i][j].scale > 1) explosions[i][j].scale -= 0.01f;
|
||||
explosions[i][j].angle += explosions[i][j].dir.x + explosions[i][j].dir.y;
|
||||
}
|
||||
explosions[i][0].ttl--;
|
||||
|
||||
SetBlend(BlendAdd);
|
||||
SetAlpha(128);
|
||||
for (int j = 0; j < 4; j++) DrawEx(particles[i][j].pos.x, particles[i][j].pos.y, 0, 85, 10, 10, particles[i][j].scale, particles[i][j].angle);
|
||||
Tint(255, 128, 0);
|
||||
SetAlpha(64);
|
||||
for (int j = 0; j < 4; j++) DrawEx(particles[i][j].pos.x, particles[i][j].pos.y, 0, 85, 10, 10, particles[i][j].scale * 2, particles[i][j].angle);
|
||||
SetBlend(BlendBlend);
|
||||
Tint(255, 255, 255);
|
||||
SetAlpha(255);
|
||||
for (int j = 0; j < 4; j++) {
|
||||
if (particles[i][j].scale > 0.0f) {
|
||||
particles[i][j].pos.x += particles[i][j].dir.x;
|
||||
particles[i][j].pos.y += particles[i][j].dir.y;
|
||||
particles[i][j].scale -= 0.1f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GenerateExplosion(int x, int y) {
|
||||
for (int i = 0; i < MAX_EXPLOSIONS; i++) {
|
||||
if (explosions[i][0].ttl == 0) {
|
||||
explosions[i][0].ttl = 60;
|
||||
for (int j = 0; j < PIXELS_PER_EXPLOSION; j++) {
|
||||
explosions[i][j].pos.x = x;
|
||||
explosions[i][j].pos.y = y;
|
||||
explosions[i][j].dir.x = ((rand() % 200) - 100)*0.1f;
|
||||
explosions[i][j].dir.y = ((rand() % 200) - 100)*0.1f;
|
||||
explosions[i][j].scale = 1 + (rand() % 100)*0.04f;
|
||||
explosions[i][j].angle = rand() % 360;
|
||||
}
|
||||
for (int j = 0; j < PARTICLES_PER_EXPLOSION; j++) {
|
||||
particles[i][j].pos.x = x;
|
||||
particles[i][j].pos.y = y;
|
||||
particles[i][j].dir.x = ((rand() % 200) - 100)*0.02f;
|
||||
particles[i][j].dir.y = ((rand() % 200) - 100)*0.02f;
|
||||
particles[i][j].scale = 4;
|
||||
particles[i][j].angle = rand() % 360;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Explosions::ProcessMessage(const char* msg) {
|
||||
if (msg == "GenerateExplosion") {
|
||||
int* params = GetMessageParams();
|
||||
GenerateExplosion(params[0], params[1]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user