Pygame没有检测到碰撞时的所有关键事件

时间:2016-04-07 04:27:46

标签: python pygame collision-detection

我是Python和Pygame的新手,我正在设计一个用键盘演奏的Dance Dance Revolution的简单克隆。我设置它来检测下降箭头和它下面的静态箭头之间的碰撞,我设置它来检测碰撞过程中正确的按键。问题是它只会在某些时候检测到一些按键。我不知道为什么,代码已经超越了我。

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"

我离开了类定义,可以根据请求获取它们。事件循环检测到碰撞期间按下的向下箭头,但没有别的。这是一个快速解决方案吗?有没有更好的处理方式?谢谢。

1 个答案:

答案 0 :(得分:1)

假设你有2支箭。

你遍历所有这些。

第一个将collisionLeft(或其他一些标志)设置为True,但是然后检查同一循环中的第二个箭头,该箭头不会与{{1}发生碰撞},因此arrowleft将设置为collisionLeft

在该循环之后,您继续检查按键,但FalsecollisionLeft,即使第一个箭头与False发生碰撞。

我希望你能看到问题。

一种解决方案是将碰撞标志存储在箭头中,而不是四个单个变量,例如:

arrowleft

或类似的东西;你明白了。