2016-04-07 32 views
1

Python ve Pygame oyununda yeni biriyim ve klavyeyle birlikte Dance Dance Revolution'ın basit bir klonunu tasarlıyorum. Düşen ok ve altındaki statik ok arasındaki çarpışmayı saptamak için ayarladım ve çarpışmalar sırasında uygun tuşa basmalarını algılamaya ayarlıyorum. Sorun şu ki, bazı zamanlarda sadece bazı tuş basımlarını algılayacaktır. Neden olduğundan emin değilim ve kod önümde.Pygame çarpışmadaki tüm önemli olayları tespit etmiyor

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" 

Sınıf tanımlarını dışarıda bıraktım ve istek üzerine alabilir. Olay döngüsü, çarpışma sırasında basılan aşağı oku algılar, ancak başka hiçbir şey. Bunun için hızlı bir düzeltme var mı? Bunu işlemenin daha iyi bir yolu var mı? Teşekkür ederim.

cevap

1

2 okunuz olduğunu varsayalım.

Hepsinin üzerinde yineleyin.

birincisi True için collisionLeft (veya bu bayrakların diğer bazı) belirler, ama sonra aynı döngüde ikinci okunu kontrol edip o ok arrowleft ile çarpışmak yoktur, bu nedenle collisionLeftFalse ayarlanacaktır.

Bu döngüden sonra, devam edip tuşlara basıp, collisionLeft, False, ilk okun arrowleft ile çarpışsa bile.

Umarım sorunu görürsünüz.


bir çözüm, örneğin, dört yerine tek değişkenli oklar çarpışma bayrakları saklamaktır: böyle

... 
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) 
     ... 

ya da bir şey; kaptın bu işi.

+0

çok teşekkür ederim! bu mükemmel bir anlam ifade ediyor. – ineptchimpanzee