125 lines
2.4 KiB
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;
|
|
}
|