//------------------------------------------------------------------------------
// Gestion des touches standard
//------------------------------------------------------------------------------
void GestionClavier(unsigned char key, int x, int y)
{
switch (key)
{
// Console ON/OFF
case 178 /* Touche Puissance 2 */:
if (cg_console_size <= 0) cg_console_size=480;
if (cg_console==0) cg_console=1;
else cg_console=0;
PlaySound("sons/plasmx1a.wav",NULL,SND_ASYNC);
break;
// Menu ON/OFF
case 27 /* Touche Echap */ :
main_menu=!main_menu;
map_menu=false;
graph_menu=false;
break;
// Autres touches, notamment pour les déplacements
default:
g_keys[key] = true; // Grace au booleen, on peut combiner les touches
break;
}
}
//------------------------------------------------------------------------------
// Gestion des touches avancées du clavier (flèches, F1-12, etc ...)
//------------------------------------------------------------------------------
void GestionSpecial(int key, int x, int y)
{
switch (key)
{
// Recentrer
case GLUT_KEY_HOME :
mouse_up=mouse_rl=move_rl=run=jump=0;
break;
// Descendre
case GLUT_KEY_PAGE_DOWN :
jump-=0.5;
break;
// Monter
case GLUT_KEY_PAGE_UP :
jump+=0.5;
break;
case GLUT_KEY_F10:
exit(0);
break;
}
}
//------------------------------------------------------------------------------
// Gestion des mouvements
//------------------------------------------------------------------------------
void ClavierBouge()
{
// utilisées pour les déplacements temporaires et les collisions
register double pas_run, pas_move_rl; // Pas effectués
register double move_rl_tmp=1; // Droite-Gauche
register double run_tmp=1; // Avant-Arrière
// EXPLICATIONS
//
// SI une touche est appuyée
// {
// on calcule un RUN temporaire, avec la formule du TARGETX, pour voir si la position voulue aura un sol
// on calcule un MOVE_RL temporaire, avec la formule du TARGETY, idem
// SI notre nouvelle position a un sol OU si on est en spectateur
// {
// on donne la valeur temporaire à RUN
// on donne la valeur temporaire à MOVE_RL
// SI on est en spectateur, on calcule le nouveau JUMP, avec la formule du targetz
// SINON on fait un léger effet de haut-bas lors du déplacement
// }
// SINON
// {
// SI il y a un mur devant, on peut toujours "glisser" dessus vers la gauche ou la droite
// on donne la valeur temporaire à MOVE_RL, c'est-à-dire qu'on glissera sur le mur sans avancer dans le mur.
// SINON
// SI il y a un mur devant, on peut toujours "glisser" dessus devant ou derrière
// on donne la valeur temporaire à RUN, c'est-à-dire qu'on glissera sur le mur sans le transpercer
// }
// }
// Avancer
if (g_keys['e'])
{
pas_run=(10/temps.fps)*cos(((width-mouse_rl)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
pas_move_rl=(10/temps.fps)*sin(((mouse_rl-width)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
run_tmp=run+pas_run;
move_rl_tmp=move_rl+pas_move_rl;
if ((mat[(int)((move_rl_tmp+9*pas_move_rl)/scal+1)][(int)((run_tmp+9*pas_run)/scal+1)]==1) || (cg_player==0))
{
run=run_tmp;
move_rl=move_rl_tmp;
if (cg_player==0) jump+=0.1*sin(((height-mouse_up)/height)*pi/2);
else jump=2+cos(move_hb/pi/pi)/pi;
}
else
{
if (mat[(int)((move_rl_tmp+9*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp+9*pas_run)/scal+1)]==1) run=run_tmp;
}
}
// Reculer
if (g_keys['d'])
{
pas_run=(10/temps.fps)*cos(((width-mouse_rl)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
pas_move_rl=(10/temps.fps)*sin(((mouse_rl-width)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
run_tmp=run-pas_run;
move_rl_tmp=move_rl-pas_move_rl;
if ((mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) || (cg_player==0))
{
run=run_tmp;
move_rl=move_rl_tmp;
if (cg_player==0) jump-=0.1*sin(((height-mouse_up)/height)*pi/2);
else jump=2+cos(move_hb/pi/pi)/pi;
}
else
{
if (mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) run=run_tmp;
}
}
// Gauche
if (g_keys['s'])
{
pas_run=(10/temps.fps)*sin(((width-mouse_rl)/width)*pi/2);
pas_move_rl=(10/temps.fps)*cos(((mouse_rl-width)/width)*pi/2);
run_tmp=run-pas_run;
move_rl_tmp=move_rl-pas_move_rl;
if ((mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) || (cg_player==0))
{
run=run_tmp;
move_rl=move_rl_tmp;
if (cg_player!=0) jump=2+cos(move_hb/pi/pi)/pi;
}
else
{
if (mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) run=run_tmp;
}
}
// Droite
if (g_keys['f'])
{
pas_run=(10/temps.fps)*sin(((width-mouse_rl)/width)*pi/2);
pas_move_rl=(10/temps.fps)*cos(((mouse_rl-width)/width)*pi/2);
run_tmp=run+pas_run;
move_rl_tmp=move_rl+pas_move_rl;
if ((mat[(int)((move_rl_tmp+6*pas_move_rl)/scal+1)][(int)((run_tmp+6*pas_run)/scal+1)]==1) || (cg_player==0))
{
run=run_tmp;
move_rl=move_rl_tmp;
if (cg_player!=0) jump=2+cos(move_hb/pi/pi)/pi;
}
else
{
if (mat[(int)((move_rl_tmp+6*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp+6*pas_run)/scal+1)]==1) run=run_tmp;
}
}
if ((g_keys['e']) || (g_keys['s']) || (g_keys['d']) || (g_keys['f']))
move_hb+=temps.ecart*75; // Monter-Descendre lorsqu'on marche
// Zoom ON/OFF, touche espace
zoom=g_keys[32];
// Blending ON/OFF
g_blend = g_keys['b'];
if (g_blend) Blend_ON
else Blend_OFF
// Light ON/OFF
light=g_keys['l'];
if (!light) glDisable(GL_LIGHTING);
else glEnable(GL_LIGHTING);
// Scroll Up
if (g_keys['i'] && (scroll>0)) // Is Up Arrow Being Pressed?
scroll-=4; // If So, Decrease 'scroll' Moving Screen Down
// Scroll Down
if (g_keys['k'] && (scroll<16*(maxtokens-16))) // Is Down Arrow Being Pressed?
scroll+=4; // If So, Increase 'scroll' Moving Screen Up
}
//------------------------------------------------------------------------------
// Détecte si une touche normale est relachée, et la désactive si nécessaire
//------------------------------------------------------------------------------
void KeyN_up(unsigned char key, int x, int y)
{
g_keys[key] = false;
}
//------------------------------------------------------------------------------
// Gestion des mouvements de la souris - dépend de la sensitivity
//------------------------------------------------------------------------------
void SourisBouge()
{
GetCursorPos(&mpos); // On récupère la position actuelle du curseur
// Aucun effet si on regarde à plus de 90° en haut ou 90° en bas
if ((mouse_up>0-(mpos.y-height)*sensitivity) && (mouse_up<height*2-(mpos.y-height)*sensitivity))
mouse_up+=(mpos.y-height)*sensitivity; // souris Haut - Bas
mouse_rl+=(mpos.x-width)*sensitivity; // Souris Gauche - Droite
SetCursorPos(width, height); // Repositionne le curseur au centre
}
//------------------------------------------------------------------------------
// Gestion des tirs à la souris
//------------------------------------------------------------------------------
void SourisTir(int button, int state, int x, int y)
{
int boucle;
if ((button==GLUT_LEFT_BUTTON) && (state==GLUT_DOWN))
{
fire=true; // on active le tir, pour la fumée
for (boucle=1; boucle<=TOTAL_BOUTON; boucle++) // Pour les boutons
if ((mpos.x>bouton[boucle].x1) && (mpos.y>bouton[boucle].y1) && (mpos.x<bouton[boucle].x2) && (mpos.y<bouton[boucle].y2))
bouton[boucle].clic=!bouton[boucle].clic;
if (!menu)
PlaySound("sons/sshotf1b.wav",NULL,SND_ASYNC); // Pour le son du tir
else
PlaySound("sons/change.wav",NULL,SND_ASYNC); // Pour le son du tir
}
}
//------------------------------------------------------------------------------
// Fin Du Fichier
//------------------------------------------------------------------------------