1v13d/src/FxEngine/FxEngine.c

125 lines
2.4 KiB
C
Raw Normal View History

2019-07-20 16:03:28 +02:00
#include "FxEngine.h"
2019-07-21 16:32:43 +02:00
2019-08-16 16:00:35 +02:00
FE_position FE_user = {0,0,0};
double FE_dh, FE_dv, FE_roulis;
2019-07-20 16:03:28 +02:00
2019-08-16 16:00:35 +02:00
static double px, py, pz; // instance flottante des coordonnées des joueurs
2019-07-24 21:54:07 +02:00
2019-08-16 16:00:35 +02:00
static uint32_t frame_interval = 0, frame_interval_min = 1000001, frame_interval_max = 1 ; // in milliseconds
static bool loaded_before = false;
2019-07-20 16:03:28 +02:00
2019-08-16 16:00:35 +02:00
static double dh_vel = 0.05;
static double dv_vel = 0.05;
static double roulis_vel = 0.05;
2019-07-22 19:17:16 +02:00
2019-08-16 15:57:18 +02:00
static void FE_move()
2019-07-21 20:14:54 +02:00
{
key_event_t event;
while (true)
{
event=pollevent();
if (event.type&KEYEV_DOWN)
{
2019-07-22 19:17:16 +02:00
if (event.key==KEY_LEFT)
2019-08-16 15:57:18 +02:00
FE_dh -= dh_vel;
2019-07-22 19:17:16 +02:00
if (event.key==KEY_RIGHT)
2019-08-16 15:57:18 +02:00
FE_dh += dh_vel;
2019-07-22 19:17:16 +02:00
if (event.key==KEY_UP)
2019-08-16 15:57:18 +02:00
FE_dv += dv_vel;
2019-07-22 19:17:16 +02:00
if (event.key==KEY_DOWN)
2019-08-16 15:57:18 +02:00
FE_dv -= dv_vel;
2019-07-23 18:30:27 +02:00
if (event.key==KEY_PLUS)
2019-08-16 15:57:18 +02:00
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);
2019-07-24 21:54:07 +02:00
if (event.key==KEY_8)
{
2019-08-16 15:57:18 +02:00
py += FE_cos(FE_dh);
px += FE_sin(FE_dh);
2019-07-24 21:54:07 +02:00
}
if (event.key==KEY_5)
{
2019-08-17 14:09:45 +02:00
py += FE_cos(FE_dh + FE_PI);
px += FE_sin(FE_dh + FE_PI);
2019-07-24 21:54:07 +02:00
}
if (event.key==KEY_4)
{
2019-08-17 14:09:45 +02:00
py += FE_cos(FE_dh - FE_PI_SUR_2);
px += FE_sin(FE_dh - FE_PI_SUR_2);
2019-07-24 21:54:07 +02:00
}
if (event.key==KEY_6)
{
2019-08-17 14:09:45 +02:00
py += FE_cos(FE_dh + FE_PI_SUR_2);
px += FE_sin(FE_dh + FE_PI_SUR_2);
2019-07-24 21:54:07 +02:00
}
}
2019-08-16 15:57:18 +02:00
if (event.type==KEYEV_NONE) // si tous les évènements ont été traités
break;
}
2019-08-16 15:57:18 +02:00
FE_user.x = px; // actualisation des coordonnées de position
FE_user.y = py;
FE_user.z = pz;
2019-07-21 20:14:54 +02:00
}
2019-08-16 15:57:18 +02:00
void FE_new_frame()
2019-07-20 16:03:28 +02:00
{
2019-08-16 15:57:18 +02:00
dupdate(); // fin du cycle précédent
// gestion du temps avec libprof
2019-07-20 16:47:37 +02:00
if (loaded_before)
2019-07-21 20:14:54 +02:00
{
2019-07-20 16:47:37 +02:00
prof_leave(0);
2019-08-16 15:57:18 +02:00
frame_interval = prof_time(0);
if (frame_interval<frame_interval_min)
2019-08-16 15:57:18 +02:00
frame_interval_min = frame_interval;
if (frame_interval>frame_interval_max)
2019-08-16 15:57:18 +02:00
frame_interval_max = frame_interval;
2019-07-21 20:14:54 +02:00
}
2019-07-20 16:47:37 +02:00
else
{
2019-08-16 15:57:18 +02:00
prof_init(1, 0);
2019-07-20 16:47:37 +02:00
loaded_before=true;
}
2019-07-20 16:53:07 +02:00
prof_clear(0);
2019-07-20 16:47:37 +02:00
prof_enter(0);
2019-07-23 15:52:20 +02:00
FE_zbuffer_clear();
2019-08-16 15:57:18 +02:00
//actualisation de la position, de la direction et des données liées
FE_move();
FE_set_matrice();
2019-07-20 16:03:28 +02:00
dclear(C_WHITE);
2019-07-20 16:03:28 +02:00
}
2019-08-16 16:00:35 +02:00
#define MICROSECOND 1000000
2019-08-16 15:57:18 +02:00
2019-08-17 14:09:45 +02:00
uint32_t FE_get_fps_current()
{
2019-08-16 15:57:18 +02:00
return MICROSECOND / frame_interval;
}
2019-08-17 14:09:45 +02:00
uint32_t FE_get_fps_min()
2019-08-16 15:57:18 +02:00
{
return MICROSECOND / frame_interval_max;
}
2019-08-17 14:09:45 +02:00
uint32_t FE_get_fps_max()
2019-08-16 15:57:18 +02:00
{
return MICROSECOND / frame_interval_min;
}
2019-08-16 15:57:18 +02:00
static char fps_history[15];
2019-08-16 15:57:18 +02:00
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;
2019-08-17 14:09:45 +02:00
}