[Add] Let's get ready to RUUUMMMBLLLEEEEE!!

This commit is contained in:
Allanis 2013-05-18 15:40:18 +01:00
parent aad02e8134
commit f271a2cbb8
5 changed files with 72 additions and 2 deletions

View File

@ -301,6 +301,8 @@ static void update_all(void) {
// | Text and GUI.
// ========================================================
static void render_all(void) {
// Setup.
spfx_start(dt);
// BG.
space_render(dt);
planets_render();

View File

@ -425,7 +425,8 @@ static void pilot_update(Pilot* pilot, const double dt) {
limit_speed(&pilot->solid->vel,
pilot->speed * pilot->afterburner->outfit->u.afb.speed_perc +
pilot->afterburner->outfit->u.afb.speed_abs, dt);
pilot->energy -= pilot->afterburner->outfit->u.afb.energy * dt;
spfx_shake(SHAKE_DECAY/2. * dt); // Shake goes down at half speed.
pilot->energy -= pilot->afterburner->outfit->u.afb.energy * dt; // Energy loss.
} else
limit_speed(&pilot->solid->vel, pilot->speed, dt);
}

View File

@ -21,6 +21,7 @@
#include "hook.h"
#include "map.h"
#include "lfile.h"
#include "spfx.h"
#include "player.h"
#define XML_GUI_ID "GUIs" // XML section identifier.
@ -1319,6 +1320,7 @@ void player_afterburn(void) {
if(player->afterburner != NULL) {
player_setFlag(PLAYER_AFTERBURNER);
pilot_setFlag(player, PILOT_AFTERBURNER);
spfx_shake(50.);
}
}

View File

@ -6,11 +6,21 @@
#include "physics.h"
#include "opengl.h"
#include "pause.h"
#include "rng.h"
#include "spfx.h"
#define SPFX_GFX "../gfx/spfx/" // Graphics location.
#define SPFX_CHUNK 10 // Chunk to allocate when needed.
#define SPFX_CHUNK 32 // Chunk to allocate when needed.
// Special hardcoded effects..
// Shake, AKA RUMBLE!
static double shake_rad = 0.;
static Vec2 shake_pos = { .x = 0., .y = 0. };
static Vec2 shake_vel = { .x = 0., .y = 0. };
static int shake_off = 1;
// Generic SPFX template.
typedef struct SPFX_Base_ {
char* name;
@ -171,6 +181,54 @@ static void spfx_update_layer(SPFX* layer, int* nlayer, const double dt) {
}
}
// Prepare the rendering for special affects.
void spfx_start(double dt) {
GLdouble bx, by, x, y;
double inc;
if(shake_off == 1) return; // Save the cycles.
bx = SCREEN_W / 2;
by = SCREEN_H / 2;
if(!paused) {
inc = dt*100000.;
// Calculate new position.
if(shake_rad > 0.01) {
vect_cadd(&shake_pos, shake_vel.x * inc, shake_vel.y * inc);
if(VMOD(shake_pos) > shake_rad) {
// Change direction.
vect_pset(&shake_pos, shake_rad, VANGLE(shake_pos));
vect_pset(&shake_vel, shake_rad,
-VANGLE(shake_pos) + (RNGF()-0.5) * M_PI);
}
shake_rad -= SHAKE_DECAY * dt;
if(shake_rad < 0.) shake_rad = 0.;
x = shake_pos.x;
y = shake_pos.y;
} else {
shake_rad = 0.;
shake_off = 1;
x = 0.;
y = 0.;
}
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-bx+x, bx+x, -by+y, by+y, -1., 1.);
}
// Add ruuumble!!
void spfx_shake(double mod) {
shake_rad += mod;
if(shake_rad > SHAKE_MAX) shake_rad = SHAKE_MAX;
shake_off = 0;
vect_pset(&shake_vel, shake_rad, RNGF() * 2. * M_PI);
}
void spfx_render(const int layer) {
SPFX* spfx_stack;
int i, spfx_nstack;

View File

@ -4,6 +4,9 @@
#define SPFX_LAYER_FRONT 0
#define SPFX_LAYER_BACK 1
#define SHAKE_DECAY 50. // Decay parameter.
#define SHAKE_MAX 50. // Max parameter.
// Stack manipulation.
int spfx_get(char* name);
void spfx_add(const int effect,
@ -16,6 +19,10 @@ void spfx_update(const double dt);
void spfx_render(const int layer);
void spfx_clear(void);
// Get ready to rumble!
void spfx_start(double dt);
void spfx_shake(double mod);
// Load/free.
int spfx_load(void);
void spfx_free(void);