Utilitaires

Répétition simultanée de plusieurs touches clavier

import pygame

#définition d'un nouvel évènement pour représenter une touche qui reste enfoncée
pygame.KEYPRESSED = pygame.USEREVENT

BLEU_CIEL = (135, 206, 250)

FENETRE_LARGEUR = 800
FENETRE_HAUTEUR = 600

FLAPPY_LARGEUR = 60
FLAPPY_HAUTEUR = 51

pygame.init()

# Gestionnaire de répétition automatique de plusieurs touches
# !!! NE PAS UTILISER pygame.key.set_repeat() dans votre programme !!!
# ===== début GestionClavier ===== 
def _nouveauEtatTouche():
    return {
        'actif': False,
        'delai': 0,
        'periode': 0,
        'suivant': 0
    }

def nouvelleGestionClavier():
    return {}

# gc: gestionnaire de clavier (créé par nouvelleGestion Clavier())
# touche: numéro de la touche (ex: pygame.K_e)
# delai: attente (en ms) avant la première répétition
# periode: temps (en ms) entre deux répétitions

def repeteTouche(gc, touche, delai, periode):
    pygame.key.set_repeat()
    
    if touche in gc:
        entree = gc[touche]
    else:
        entree = _nouveauEtatTouche()

    entree['delai'] = delai
    entree['periode'] = periode
    gc[touche] = entree


def scan(gc):
    maintenant = pygame.time.get_ticks()
    keys = pygame.key.get_pressed()
    for touche in gc:
        if keys[touche] == 1:
            if gc[touche]['actif']:
                if maintenant >= gc[touche]['suivant']:
                    gc[touche]['suivant'] = gc[touche]['periode'] + maintenant
                    pygame.event.post(pygame.event.Event(pygame.KEYPRESSED, {'key':touche}))
            else:
                gc[touche]['actif'] = True
                gc[touche]['suivant'] = gc[touche]['delai'] + maintenant
        else:
            gc[touche]['actif'] = False
            gc[touche]['suivant'] = 0

        
# ===== fin GestionClavier =====

    
fenetre_taille = (FENETRE_LARGEUR, FENETRE_HAUTEUR)
fenetre = pygame.display.set_mode(fenetre_taille)
pygame.display.set_caption('Test keyboard')

fini = False
temps = pygame.time.Clock()

fenetre.fill(BLEU_CIEL)
pygame.display.flip()

# répétition de plusieurs touches
gc = nouvelleGestionClavier()
repeteTouche(gc, pygame.K_e, 100, 25)
repeteTouche(gc, pygame.K_j, 100, 25)

while not fini:
    now = pygame.time.get_ticks()
    # --- Traiter entrées joueur
    scan(gc) # DOIT être appelée avant pygame.event.get()
    events = pygame.event.get()
    #print("Events: " + str(len(events)))
    for evenement in events:
        #print(str(evenement))
        if evenement.type == pygame.QUIT:
            fini = True
        if evenement.type == pygame.KEYDOWN:
            print("KEYDOWN: " + str(evenement.key) + " " + str(now))
        elif evenement.type == pygame.KEYPRESSED:
            print("KEYPRESSED:" + str(evenement.key) + " " + str(now))

    #print("keys: " + str(tk))



    temps.tick(50)

pygame.display.quit()
pygame.quit()
exit()