Ajouter un contrôle dans les configurations des touches

Écrit le 18/11/2003 par FreeZeBiT
Dernière mise à jour : 06/02/2006

Introduction

Je vais vous présenter dans ce tutorial la marche à suivre pour pouvoir ajouter dans le menu de configuration des touches une action à laquelle on pourra affecter une touche.

En bleu le code original , en rouge le code ajouté ou modifié .

Mise en place

Tout d'abord, il vous faut votre fonction, par exemple, une fonction qui sert à recharger votre arme pendant une partie. Cette fonction est déclarée et utilisée dans la partie "game". Nous admettrons que cette fonction se nomme "Cmd_Reload" par exemple.

Donc, dans un premier temps, nous allons créer la commande de la console qui permet d'appeler cette fonction : allez dans le fichier "g_cmds.c", dans la fonction "ClientCommand( int clientNum )". Ajoutez le code suivant :

else if (Q_stricmp (cmd, "setviewpos") == 0)
Cmd_SetViewpos_f( ent );

else if (Q_stricmp (cmd, "reload") == 0)
Cmd_Reload( ent );

else if (Q_stricmp (cmd, "stats") == 0)
Cmd_Stats_f( ent );

Ce code sert tout bêtement à exécuter la fonction "Cmd_Reload" lorsque vous taperez "reload" dans la console.

Création du menu

Maintenant, on va pouvoir créer un menu qui nous permette de faire un bind sur cette commande "reload". Ceci se passe dans "q3_ui", dans le fichier "ui_controls2.c".

Au début de ce fichier, on va créer un id à notre menu :

#define ID_ATTACK 26
#define ID_RELOAD 27
#define ID_WEAPPREV 28

Vous pouvez mettre un autre id, par exemple plutôt que de modifier tous les id suivants le votre, mettez directement 42.

Ensuite, il nous faut déclarer notre menu (que l'on va nommé logiquement "reload") dans la structure "controls_t" :

menuaction_s attack;
menuaction_s reload;
menuaction_s prevweapon;

Maintenant, dans "bind_t g_bindings", on va définir les propriétés de notre menu :

{"+attack", "attack", ID_ATTACK, ANIM_ATTACK, K_CTRL, -1, -1, -1},
{"reload", "reload", ID_RELOAD, 0, 'r', -1, -1, -1},
{"weapprev", "prev weapon", ID_WEAPPREV, ANIM_IDLE, '[', -1, -1, -1},

Ici, le premier terme reload correspond à la commande de la console qui sera affectée à une touche, le deuxième correspond au texte affiché dans le menu de quake 3. ID_RELOAD pour pouvoir identifier, 0 car on ne lance pas d'animation du joueur quand on recharge, si votre fichier md3 de votre joueur possède une animation de rechargement, vous pouvez la coder et placer ici un ANIM_RELOAD qui lancera cette animation quand vous rechargez votre arme. Enfin 'r' pour affecter la touche "r" du clavier comme touche par défaut.

Bien, maintenant, nous allons créer le menu en tant que tel : allez dans "menucommon_s *g_weapons_controls[]" qui permet de déclarer les menus qui seront placés dans la catégorie "shoot" dans le jeu... Oui, évidemment, on pourrait placer notre "reload" dans une autre catégorie mais en toute logique, on va le placer dans celle-ci.
Bref, ajoutez cette petite ligne :

(menucommon_s *)&s_controls.attack,
(menucommon_s *)&s_controls.reload,
(menucommon_s *)&s_controls.nextweapon,

Là, il nous faut définir toutes les propriétés de note menu, pour cela, allez dans la fonction "Controls_MenuInit" et ajoutez :

s_controls.attack.generic.type = MTYPE_ACTION;
s_controls.attack.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
s_controls.attack.generic.callback = Controls_ActionEvent;
s_controls.attack.generic.ownerdraw = Controls_DrawKeyBinding;
s_controls.attack.generic.id = ID_ATTACK;

s_controls.reload.generic.type = MTYPE_ACTION;
s_controls.reload.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
s_controls.reload.generic.callback = Controls_ActionEvent;
s_controls.reload.generic.ownerdraw = Controls_DrawKeyBinding;
s_controls.reload.generic.id = ID_RELOAD;

s_controls.prevweapon.generic.type = MTYPE_ACTION;
s_controls.prevweapon.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
s_controls.prevweapon.generic.callback = Controls_ActionEvent;
s_controls.prevweapon.generic.ownerdraw = Controls_DrawKeyBinding;
s_controls.prevweapon.generic.id = ID_WEAPPREV;

On ne sembête pas, on reprend les même propriétés que pour les autres et on change juste l'id, ce qui est logique en soit...

Et enfin, il ne nous reste plus qu'à afficher notre menu à l'endroit que l'on veut dans la catégorie "shoot", moi, je l'ai placé entre le "attack" et le "next weapon" (on reste dans la même fonction) :

Menu_AddItem( &s_controls.menu, &s_controls.attack );
Menu_AddItem( &s_controls.menu, &s_controls.reload );
Menu_AddItem( &s_controls.menu, &s_controls.nextweapon );

Pour finir

Ben y'a plus rien à faire !! Compilez, lancez votre mod et allez dans "setupcontrolsshoot", vous y verrez ceci :
shoot
reload
next weapon
prev weapon
etc...