1v13d/src/FxEngine/FxEngine.c

125 lines
2.4 KiB
C

#include "FxEngine.h"
FE_position FE_user = {0,0,0};
double FE_dh, FE_dv, FE_roulis;
static double px, py, pz; // instance flottante des coordonnées des joueurs
static uint32_t frame_interval = 0, frame_interval_min = 1000001, frame_interval_max = 1 ; // in milliseconds
static bool loaded_before = false;
static double dh_vel = 0.05;
static double dv_vel = 0.05;
static double roulis_vel = 0.05;
static void FE_move()
{
key_event_t event;
while (true)
{
event=pollevent();
if (event.type&KEYEV_DOWN)
{
if (event.key==KEY_LEFT)
FE_dh -= dh_vel;
if (event.key==KEY_RIGHT)
FE_dh += dh_vel;
if (event.key==KEY_UP)
FE_dv += dv_vel;
if (event.key==KEY_DOWN)
FE_dv -= dv_vel;
if (event.key==KEY_PLUS)
FE_roulis += roulis_vel;
FE_dh = FE_modulo_2pi(FE_dh);
FE_dv = FE_modulo_2pi(FE_dv);
FE_roulis = FE_modulo_2pi(FE_roulis);
if (event.key==KEY_8)
{
py += FE_cos(FE_dh);
px += FE_sin(FE_dh);
}
if (event.key==KEY_5)
{
py += FE_cos(FE_dh + FE_PI);
px += FE_sin(FE_dh + FE_PI);
}
if (event.key==KEY_4)
{
py += FE_cos(FE_dh - FE_PI_SUR_2);
px += FE_sin(FE_dh - FE_PI_SUR_2);
}
if (event.key==KEY_6)
{
py += FE_cos(FE_dh + FE_PI_SUR_2);
px += FE_sin(FE_dh + FE_PI_SUR_2);
}
}
if (event.type==KEYEV_NONE) // si tous les évènements ont été traités
break;
}
FE_user.x = px; // actualisation des coordonnées de position
FE_user.y = py;
FE_user.z = pz;
}
void FE_new_frame()
{
dupdate(); // fin du cycle précédent
// gestion du temps avec libprof
if (loaded_before)
{
prof_leave(0);
frame_interval = prof_time(0);
if (frame_interval<frame_interval_min)
frame_interval_min = frame_interval;
if (frame_interval>frame_interval_max)
frame_interval_max = frame_interval;
}
else
{
prof_init(1, 0);
loaded_before=true;
}
prof_clear(0);
prof_enter(0);
FE_zbuffer_clear();
//actualisation de la position, de la direction et des données liées
FE_move();
FE_set_matrice();
dclear(C_WHITE);
}
#define MICROSECOND 1000000
uint32_t FE_get_fps_current()
{
return MICROSECOND / frame_interval;
}
uint32_t FE_get_fps_min()
{
return MICROSECOND / frame_interval_max;
}
uint32_t FE_get_fps_max()
{
return MICROSECOND / frame_interval_min;
}
static char fps_history[15];
char* FE_get_fps_history()
{
sprintf(fps_history, "%d/%d/%d", FE_get_fps_min(), FE_get_fps_current(), FE_get_fps_max());
return fps_history;
}