2016-04-07 6 views
1

Ich bin neu bei Python und Pygame und entwerfe einen einfachen Klon von Dance Dance Revolution, der mit der Tastatur gespielt wird. Ich habe es eingerichtet, um die Kollision zwischen dem fallenden Pfeil und dem darunter liegenden statischen Pfeil zu erkennen, und ich habe es eingestellt, um die richtigen Tastenbetätigungen während Kollisionen zu erkennen. Das Problem ist, dass es nur einige der Tastenbetätigungen einige Male erkennt. Ich bin mir nicht sicher warum und der Code hat mich überholt.Pygame erkennt nicht alle Schlüsselereignisse bei Kollision

def collisionDetect(arrow, contact_arrow): 
    return pygame.sprite.collide_rect(arrow, contact_arrow) 

def game(list): 

running = True 
for i in list: 
    arrow = Arrow(i[0],i[1],0,0,screen,SCREEN_WIDTH,SCREEN_HEIGHT) 
    arrow.positionArrow() 
    arrows.add(arrow) 

while running: 
    screen.fill((0,0,0)) 
    arrowleft.drawArrowPanel() 
    arrowright.drawArrowPanel() 
    arrowup.drawArrowPanel() 
    arrowdown.drawArrowPanel() 
    for arrow in arrows: 
     if arrow.y < 500: 
      arrow.arrowFall() 
      arrow.positionArrow() 
      collisionLeft = collisionDetect(arrow, arrowleft) 
      collisionRight = collisionDetect(arrow, arrowright) 
      collisionUp = collisionDetect(arrow, arrowup) 
      collisionDown = collisionDetect(arrow, arrowdown) 
     else: 
      arrow.kill() 

    pygame.display.update() 

    for e in pygame.event.get(): 
     if e.type == pygame.QUIT: 
      running = False 
      pygame.quit() 
     if e.type == pygame.KEYDOWN and e.key == pygame.K_LEFT and collisionLeft: 
      print "collided left" 
     if e.type == pygame.KEYDOWN and e.key == pygame.K_RIGHT and collisionRight: 
      print "collided right" 
     if e.type == pygame.KEYDOWN and e.key == pygame.K_UP and collisionUp: 
      print "collided up" 
     if e.type == pygame.KEYDOWN and e.key == pygame.K_DOWN and collisionDown: 
      print "collided down" 

Ich habe die Klassendefinitionen verlassen und kann sie auf Anfrage holen. Die Ereignisschleife erkennt, dass der Pfeil nach unten während der Kollision gedrückt wird, aber sonst nichts. Gibt es dafür eine schnelle Lösung? Gibt es einen besseren Weg, damit umzugehen? Vielen Dank.

Antwort

1

Angenommen, Sie haben 2 Pfeile.

Sie iterieren über alle von ihnen.

Die erste setzt collisionLeft (oder eine andere dieser Flags) zu True, aber dann überprüfen Sie den zweiten Pfeil in der gleichen Schleife, und dass Pfeil kollidieren nicht mit arrowleft, so collisionLeft wird False eingestellt werden.

Nach dieser Schleife, gehen Sie weiter und überprüfen Sie die Tasten drücken, aber collisionLeft ist False, auch wenn der erste Pfeil mit arrowleft kollidiert.

Ich hoffe, Sie sehen das Problem. statt vier einzelnen Variablen, zum Beispiel


Eine Lösung ist, die Kollision Fahnen in den Pfeilen zu speichern:

... 
for arrow in arrows: 
    if arrow.y < 500: 
     arrow.arrowFall() 
     arrow.positionArrow() 
     arrow.collisionLeft = collisionDetect(arrow, arrowleft) 
     arrow.collisionRight = collisionDetect(arrow, arrowright) 
     arrow.collisionUp = collisionDetect(arrow, arrowup) 
     arrow.collisionDown = collisionDetect(arrow, arrowdown) 
    else: 
     arrow.kill() 

pygame.display.update() 

for e in pygame.event.get(): 
    ... 
    if e.type == pygame.KEYDOWN: 
     if e.key == pygame.K_LEFT: 
      for arrow in (a for a in arrows if a.collisionLeft): 
       print "collided left " + str(arrow) 
     if e.key == pygame.K_RIGHT: 
      for arrow in (a for a in arrows if a.collisionRight): 
       print "collided right " + str(arrow) 
     ... 

oder so ähnlich; Du hast die Idee.

+0

vielen dank! das macht vollkommen Sinn. – ineptchimpanzee