La callback OnPlayerKeyStateChange ne prend pas en compte les touches de direction (flèches).
Il est donc normal que ton bout de code ne fonctionne coco76.
Par contre, il est possible de récupérer ces touches grâce à la fonction GetPlayerKeys (paramètre updown et leftright) dans un timer.
Voici un exemple de code qui émule le OnPlayerKeyStateChange avec un timer et qui permet de récupérer en temps réel (ou presque) les touches de direction (et les autres touches) :
forward TimerKeys ();
new Keys[MAX_PLAYERS], Updown[MAX_PLAYERS], Leftright[MAX_PLAYERS];
public OnGameModeInit ()
{
SetTimer ("TimerKeys", 50, true);
}
/***************************/
/* TIMER POUR LES TOUCHES */
/***************************/
public TimerKeys ()
{
new keys, updown, leftright;
new String[128+1];
for (new i=0 ; i<MAX_PLAYERS ; i++)
{
if (IsPlayerConnected (i))
{
/* On récupère les touches du joueur */
GetPlayerKeys (i, keys, updown, leftright);
/* Si les touches ont changé */
if (keys!=Keys[i] || updown!=Updown[i] || leftright!=Leftright[i])
{
/* LE CODE QUI AURAI DU ÊTRE DANS OnPlayerKeyStateChange DOIT ÊTRE MIS ICI */
/* Exemple */
format (String, 128, "keys=%d, updown=%d, leftright=%d", keys, updown, leftright);
SendClientMessage (i, 0xFF0000FF, String);
/* On sauvegarde les touches pour éviter de passer tout le temps ici */
Keys[i] = keys;
Updown[i] = updown;
Leftright[i] = leftright;
}
}
}
}
La variable keys contient toutes les touches autres que les touches de direction. C'est l'équivalent du newkeys de OnPlayerKeyStateChange.
Les deux autres variables sont réservées exclusivement aux touches de direction:
Aucune touche enfoncée : updown=0, leftright=0
Flèche haut : updown=65408 (KEY_UP), leftright=0
Flèche bas : updown=128 (KEY_DOWN), leftright=0
Flèche gauche : updown=0, leftright=65408 (KEY_LEFT)
Flèche droite : updown=0, leftright=128 (KEY_RIGHT)
Ceci permet de gérer les combinaisons de touches (droite+gauche, haut+gauche, ...)
++
Syg