La gestion des touches

OSLib inclut des fonctions pour lire les touches de manière plus simple et efficace, avec des fonctions pour récupérer les touches qui viennent d'être pressées, d'y appliquer un autorepeat, etc.

Le principe est assez simple, vous appelez oslReadKeys() à chaque frame, cela remplit une structure osl_keys qui contient toutes les informations sur les touches. oslReadKeys retourne le pointeur vers cette structure, il est donc plutôt conseillé d'utiliser la variable retournée que la variable globale (c'est plus propre). Voici deux exemples:

//Exemple à ne pas faire (risque de ne plus marcher dans le futur)
while (!osl_quit)
{
	oslReadKeys();
	if (osl_keys->pressed.cross)
		oslDebug("La croix a été pressée");
}
//C'est mieux ça
OSL_CONTROLLER *k;
while (!osl_quit)
{
	k = oslReadKeys();
	if (k->pressed.cross)
		oslDebug("La croix a été pressée");
}

Comme dit plus haut et dans les exemples, tout est écrit dans la structure de type OSL_CONTROLLER. Voici la définition:

typedef struct		{
	union		{
		struct		{
			int select:1, reserved1:2, start:1;
			int up:1, right:1, down:1, left:1;
			int L:1, R:1, reserved2:2;
			int triangle:1, circle:1, cross:1, square:1;
			int home:1, hold:1, reserved3:5, note:1;
		};
		unsigned int value;
	} held;							//Touches enfoncées (maintenues)
	union		{
		struct		{
			int select:1, reserved1:2, start:1;
			int up:1, right:1, down:1, left:1;
			int L:1, R:1, reserved2:2;
			int triangle:1, circle:1, cross:1, square:1;
			int home:1, hold:1, reserved3:5, note:1;
		};
		unsigned int value;
	} pressed;						//Touches pressées
	int autoRepeatInit;					//Temps pour l'initialisation de l'autorepeat
	int autoRepeatInterval;					//Intervalle de déclenchement de l'autorepeat
	int autoRepeatMask;					//Touches concernées par l'autorepeat
	int autoRepeatCounter;					//Compteur (interne)
	signed char analogX;					//Position horizontale du stick (-128 à +127)
	signed char analogY;					//Position verticale du stick
} OSL_CONTROLLER;

Les membres held sont les touches enfoncées. C'est simplement l'état courant du joypad, sans aucune opération particulière. Les membres pressed indiquent en revanche lorsqu'une touche vient d'être pressée. C'est pratique pour les menus par exemple. Vous pouvez également définir un autorepeat pour que si l'utilisateur laisse appuyé longtemps la touche, elle apparaîtra plusieurs fois dans le pressed. Rien de plus à faire, et vous aurez un menu naturel et fonctionnel pour l'utilisateur. AnalogX et analogY sont les positions horizontale et verticale du stick analogique, entre -128 et +127. Toutefois, avant de l'utiliser dans votre jeu, faites quelques tests sur vraie console pour voir, car ce joystick est vraiment peu précis et vous ne voudriez pas qu'il reste bloqué dans une direction alors que l'utilisateur l'a lâché parce que vous avez défini une sensibilité trop élevée.

Le membre autoRepeatInit indique le nombre d'appels nécessaire pour qu'une touche enfoncée commence à être considérée comme en autorepeat. Par exemple, si vous appelez cette fonction une fois par frame et que vous avez du 60 FPS, vous pouvez le définir à 30, comme ça si l'utilisateur laisse par exemple la touche bas appuyée pendant 0.5 seconde, elle commencera à être répétée à chaque valeur de autoRepeatInterval. Un menu fonctionnel pourrait avoir autoRepeatInit à 40 et autoRepeatInterval à 8 en assumant qu'il tourne à 60 fps. Si vous utilisez le frameskipping, assurez-vous que oslReadKeys et appelé même si la valeur de skip est vraie, comme ça vous êtes sûr que même si l'affichage est à 20 fps, le jeu tournera bien à 60 et les contrôles resteront fonctionnels. En ce qui concerne la structure globale osl_keys, vous pouvez définir ces paramètres à l'aide de macros:

oslSetKeyAutorepeat(keys,init,interval);			//Tout d'un coup
oslSetKeyAutorepeatMask(mask);				//Masque (touches concernées par l'autorepeat)
oslSetKeyAutorepeatInit(value);
oslSetKeyAutorepeatInterval(value);

Par défaut, les touches concernées par l'autorepeat sont les suivantes: OSL_KEYMASK_UP, OSL_KEYMASK_RIGHT, OSL_KEYMASK_DOWN, OSL_KEYMASK_LEFT, OSL_KEYMASK_R, OSL_KEYMASK_L. Voici un exemple pour mettre un autorepeat sur les touches gauche et droite:

oslSetKeyAutorepeat(OSL_KEYMASK_LEFT|OSL_KEYMASK_RIGHT, 40, 8);