除非我单击关闭(pygame),否则不会执行我的要求

时间:2018-07-31 02:40:32

标签: python loops button pygame main

除非我单击左上角的退出按钮(该按钮不会关闭我的游戏),否则,单击按钮的功能不会运行,而是执行我实际上要执行的任务。救命?

def game_intro():
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return
            elif event.type == pygame.MOUSEMOTION:
                for button in buttons:
                    if button[1].collidepoint(event.pos):
                        button[2] = HOVER_COLOR
                    else:
                        button[2] = BLACK

                        screen.blit(bg, (0, 0))
        for text, rect, color in buttons:
            pygame.draw.rect(screen, color, rect)
            screen.blit(text, rect)

            pygame.display.flip() 


def button_clicked():
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return
            if event.type == pygame.MOUSEBUTTONDOWN:
                print('test')

            pygame.display.flip()
            clock.tick(60)

game_intro()
button_clicked
pygame.quit()

2 个答案:

答案 0 :(得分:1)

您的game_intro函数有一个无限循环while True:,您只能从一个地方退出:

if event.type == pygame.QUIT:
    return

因此,直到您退出,该函数才永远不会返回。

这意味着其余代码将永远不会运行。


还有一个问题:退出并返回函数后,您尝试做更多的事情,而不是按照用户要求退出。


第三个问题掩盖了第二个问题:您忘记了实际呼叫button_clicked();您只需引用button_clicked函数,该函数什么都不做。


无论如何,您可能想要做的是在顶层摆脱button_clicked,并向主事件循环添加if测试,如果用户使用,则调用button_clicked()点击按钮。

那种设计会很奇怪。通常,您希望游戏只有一个框架或事件循环,而不是从一个循环跳到另一个循环。但这不是非法的,也不会做任何事,它会在这里满足您的要求。


我们在这里:

  • 如果您要做想要两个框架循环,那么您可能想在两个框架中都执行相同的clock.tick(60),而不仅仅是第二个循环。
  • 您可能只想在blit循环结束时调用一次pygame.display.flip(),而不是在循环中每次都调用一次。

但是这两个问题(最坏的情况)将导致闪烁和CPU使用率过高,而不是实际的行为破坏。

答案 1 :(得分:0)

button_clicked方法被称为:)时缺少一组括号:

game_intro()

button_clicked()

pygame.quit()
相关问题