2017-07-11 1 views
0

J'ai fait quelques petits jeux avec le module pygame et ça a été amusant. Cependant, maintenant j'essaie de déplacer le personnage avec un piano via midi en utilisant pygame.midi. il y a le problème. Je l'ai fait mais pas de la façon dont je le voulais parce que le personnage bouge parfois et l'autre ne le fait pas. Je pense que je sais où est le problème: Si je comprends bien, la fonction pygame.event.get() "attraper" les événements toujours, peu importe quand (à l'intérieur de la boucle principale du jeu), donc je pense que mon code ne se passe pas, je veux dire, je crois que le joueur ne fait pas toujours ce qu'il est censé faire parce que l'entrée midi doit être dans un "temps" spécifique pas comme pygame.event.get(). J'ai regardé dans la documentation de pygame et il semble y avoir une fonction qui fait l'affaire: pygame.midi.midis2events(), mais je ne sais pas comment l'utiliser. La question est juste: Comment puis-je déplacer le personnage à travers le piano via midi avec pygame pour que le personnage bouge à chaque fois?façons d'utiliser les événements midi pour faire bouger un joueur en pygame

import pygame as pg, pygame.midi 

WIDTH = 800 
HEIGHT = 600 
FPS = 60 

BLACK = (0,0,0) 
BLUE = (0,0,255) 


pg.init() 
pg.midi.init() 
screen = pg.display.set_mode((WIDTH,HEIGHT)) 
pg.display.set_caption('STACKOVERFLOW_EXAMPLE_MIDI') 
clock = pg.time.Clock() 

running = True 

inp = pg.midi.Input(1) 
x = WIDTH//2 
y = HEIGHT//2 
speedx = 0 

midi_list = [] 

while running: 
    clock.tick(FPS) 
    if inp.poll(): 
     midi_value = inp.read(1000)[0][0][1] 
     if midi_value==57: 
      midi_list.append(midi_value) 
      if len(midi_list)==1: 
       speedx = -1 
      else: 
       speedx = 0 
       midi_list = [] 
     if midi_value == 63: 
      running = False 
    x = x+speedx 
    screen.fill(BLUE) 
    pg.draw.rect(screen,BLACK,[x,y,50,60]) 
    pg.display.update() 
    pg.display.flip() 

pg.quit() 

J'ai besoin que le joueur se déplace vers la gauche (ou à droite) lorsque la clé piano's A3 (une note spécifique) est pressé et que le joueur cesse de se déplacer lorsque la clé a été libéré . Dans ce fragment particulier du code, mais aussi pour faire des choses comme appuyer sur la touche d'un piano et tirer une balle indépendamment du fait d'être pressé ou non, en bref, faire les mêmes choses que je peux faire avec les événements du clavier.

+0

Veuillez fournir un [mcve] du problème. –

+0

se référer à: https://github.com/xamox/pygame/blob/master/examples/midi.py –

+0

ok, je pense que j'ai un exemple minimal, complet et vérifiable! –

Répondre

0

ok! je l'ai trouvé et la réponse qui fonctionne bien pour l'instant:

if inp.poll(): 
    s(0.1) 
    midi_values = inp.read(1000) 

    for midi in midi_values: 
     midi_value = midi[0][1] 
     #Movement to the left 
     if midi_value==57: 
      midi_list.append(midi_value) 
      if len(midi_list)==1: 
       speedx = -50 

Modification du code pour itérer la liste midi_values ​​me donne la réponse d'entrée-sortie correcte sans inestability que j'ai vécu. J'ai aussi introduit un retard de sommeil (0.1) et fonctionne bien sans trop utiliser de CPU. J'ai trouvé la réponse ici: https://www.reddit.com/r/learnpython/comments/36dxu9/python_whileloop_cpu_demanding/

Le seul problème que je trouve maintenant est que la fenêtre pygame s'arrête avec le message sans réponse (ne répond pas ou quelque chose de similaire) et il cesse de fonctionner. Par exemple le cube que je bouge avec les touches du piano ne fait rien mais la touche pour fermer le programme fonctionne bien !!