Pourquoi utiliser (au niveau du bit) et lors de la gestion des événements de clavier impliquant plusieurs touches?


Harisont

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
Lapin76

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 Trueen même temps, plusieurs bits de event.modpeuvent ê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_LSHIFTet KMOD_RSHIFT. Cela signifie que KMOD_SHIFTc'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):

Articles connexes