Pourquoi utiliser (au niveau du bit) et lors de la gestion des événements de clavier impliquant plusieurs touches?
La lecture de cette question Pygame m'a fait me demander pourquoi , si je veux vérifier si la touche Maj est enfoncée (simultanément avec une autre touche), je dois écrire quelque chose comme
if event.key == K_s:
if event.mod & KMOD_SHIFT:
...
et en particulier, si je comprends parfaitement pourquoi ce fragment de code n'est pas équivalent à l'autre de la question, je me demande quelle est la raison d'une comparaison bit à bit, ce qui semble un peu bizarre dans ce contexte, où nous vérifions simplement si deux événements se produisent en même temps.
La valeur de mod
semble toujours être 1 lorsque shift est enfoncé, et au moins à première vue, la documentation ne semble pas fournir d'explication sur l'utilisation &
.
Edit : cela a été marqué comme un double de cette autre question mais ce n'est évidemment pas le cas, car
- c'est spécifique à pygame
- J'avais déjà jeté un coup d'œil et ce n'était pas du tout aussi utile que la réponse que j'ai eue, car les réponses traitent principalement des aspects plus théoriques de la question
Là voir pygame.key
:
Le clavier a également une liste d'états de modificateurs (à partir des constantes pygame.localspygame) qui peuvent être assemblés en les combinant ensemble.
Les états modificateur ( KMOD_LSHIFT
, KMOD_RSHIFT
, KMOD_LCTRL
, KMOD_RCTRL
, ...) sont représentées par un seul bit. Les états sont codés en event.mod
. Comme plusieurs états peuvent être True
en même temps, plusieurs bits de event.mod
peuvent être définis en même temps. Par conséquent, vous devez utiliser l' &
opérateur binaire AND ( ) pour masquer le bit.
L' KMOD_SHIFT
état est la combinaison (OR) des états KMOD_LSHIFT
et KMOD_RSHIFT
. Cela signifie que KMOD_SHIFT
c'est la même chose que KMOD_LSHIFT | KMOD_RSHIFT
.
D'où la condition
if event.mod & KMOD_SHIFT:
est le même que
if event.mod & (KMOD_LSHIFT | KMOD_RSHIFT):
et le même que:
if (event.mod & KMOD_LSHIFT) or (event.mod & KMOD_RSHIFT):