[Add] Let's get ready to RUUUMMMBLLLEEEEE!!
This commit is contained in:
parent
aad02e8134
commit
f271a2cbb8
@ -301,6 +301,8 @@ static void update_all(void) {
|
|||||||
// | Text and GUI.
|
// | Text and GUI.
|
||||||
// ========================================================
|
// ========================================================
|
||||||
static void render_all(void) {
|
static void render_all(void) {
|
||||||
|
// Setup.
|
||||||
|
spfx_start(dt);
|
||||||
// BG.
|
// BG.
|
||||||
space_render(dt);
|
space_render(dt);
|
||||||
planets_render();
|
planets_render();
|
||||||
|
@ -425,7 +425,8 @@ static void pilot_update(Pilot* pilot, const double dt) {
|
|||||||
limit_speed(&pilot->solid->vel,
|
limit_speed(&pilot->solid->vel,
|
||||||
pilot->speed * pilot->afterburner->outfit->u.afb.speed_perc +
|
pilot->speed * pilot->afterburner->outfit->u.afb.speed_perc +
|
||||||
pilot->afterburner->outfit->u.afb.speed_abs, dt);
|
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
|
} else
|
||||||
limit_speed(&pilot->solid->vel, pilot->speed, dt);
|
limit_speed(&pilot->solid->vel, pilot->speed, dt);
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "lfile.h"
|
#include "lfile.h"
|
||||||
|
#include "spfx.h"
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
|
|
||||||
#define XML_GUI_ID "GUIs" // XML section identifier.
|
#define XML_GUI_ID "GUIs" // XML section identifier.
|
||||||
@ -1319,6 +1320,7 @@ void player_afterburn(void) {
|
|||||||
if(player->afterburner != NULL) {
|
if(player->afterburner != NULL) {
|
||||||
player_setFlag(PLAYER_AFTERBURNER);
|
player_setFlag(PLAYER_AFTERBURNER);
|
||||||
pilot_setFlag(player, PILOT_AFTERBURNER);
|
pilot_setFlag(player, PILOT_AFTERBURNER);
|
||||||
|
spfx_shake(50.);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
60
src/spfx.c
60
src/spfx.c
@ -6,11 +6,21 @@
|
|||||||
#include "physics.h"
|
#include "physics.h"
|
||||||
#include "opengl.h"
|
#include "opengl.h"
|
||||||
#include "pause.h"
|
#include "pause.h"
|
||||||
|
#include "rng.h"
|
||||||
#include "spfx.h"
|
#include "spfx.h"
|
||||||
|
|
||||||
#define SPFX_GFX "../gfx/spfx/" // Graphics location.
|
#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_ {
|
typedef struct SPFX_Base_ {
|
||||||
char* name;
|
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) {
|
void spfx_render(const int layer) {
|
||||||
SPFX* spfx_stack;
|
SPFX* spfx_stack;
|
||||||
int i, spfx_nstack;
|
int i, spfx_nstack;
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
#define SPFX_LAYER_FRONT 0
|
#define SPFX_LAYER_FRONT 0
|
||||||
#define SPFX_LAYER_BACK 1
|
#define SPFX_LAYER_BACK 1
|
||||||
|
|
||||||
|
#define SHAKE_DECAY 50. // Decay parameter.
|
||||||
|
#define SHAKE_MAX 50. // Max parameter.
|
||||||
|
|
||||||
// Stack manipulation.
|
// Stack manipulation.
|
||||||
int spfx_get(char* name);
|
int spfx_get(char* name);
|
||||||
void spfx_add(const int effect,
|
void spfx_add(const int effect,
|
||||||
@ -16,6 +19,10 @@ void spfx_update(const double dt);
|
|||||||
void spfx_render(const int layer);
|
void spfx_render(const int layer);
|
||||||
void spfx_clear(void);
|
void spfx_clear(void);
|
||||||
|
|
||||||
|
// Get ready to rumble!
|
||||||
|
void spfx_start(double dt);
|
||||||
|
void spfx_shake(double mod);
|
||||||
|
|
||||||
// Load/free.
|
// Load/free.
|
||||||
int spfx_load(void);
|
int spfx_load(void);
|
||||||
void spfx_free(void);
|
void spfx_free(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user