【问题标题】:Doesn't perform what I'm asking unless I click close (pygame)除非我单击关闭(pygame),否则不会执行我的要求
【发布时间】:2019-01-07 08:07:39
【问题描述】:

按钮单击功能不会运行,除非我单击左上角的退出按钮,这不会关闭我的游戏,而是执行我实际要求它执行的任务。帮助?

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

【问题讨论】:

    标签: python loops button pygame main


    【解决方案1】:

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

    if event.type == pygame.QUIT:
        return
    

    所以,在你退出之前,函数永远不会返回。

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


    还有一个额外的问题:在你退出并且你的函数返回之后,你尝试做更多的事情,而不是像用户要求的那样退出。


    还有隐藏第二个问题的第三个问题:您忘记实际调用button_clicked();您只需引用函数button_clicked,它什么都不做。


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

    那个设计会很奇怪。通常,您希望游戏具有单帧或事件循环,而不是从一个循环跳到另一个循环。但它不会是非法的或任何东西,它会做你在这里似乎想要的。


    当我们这样做的时候:

    • 如果您确实想要两个帧循环,您可能希望在两个帧循环中都使用相同的clock.tick(60),而不仅仅是第二个。
    • 您可能只想在 blit 循环结束时调用一次 pygame.display.flip(),而不是每次在循环内调用。

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

    【讨论】:

    • 我是 pygame 的新手,我只是按照教程进行操作。单个帧或事件循环会是什么样子,然后我将如何调用事件循环下的不同函数。
    • @CianMc 通常,您只需调用一个执行某些操作(例如,修改一些变量、创建一些精灵等)的函数,然后立即返回到您的帧循环。我不知道您正在关注哪些教程,但这几乎是所有教程的内容。唯一真正的例外是当你有“模态”功能时——例如,你所做的菜单、游戏和高分页面之间的差异如此之大,以至于它们有完全独立的循环是有意义的——在这种情况下你没有' t 从帧循环调用一个函数,你返回到一些运行适当的下一个循环的顶级代码。
    【解决方案2】:

    button_clicked 方法在被调用时缺少一组括号:)

    game_intro()
    
    button_clicked()
    
    pygame.quit()
    

    【讨论】:

    • 哦哈哈没看到,问题还在发生:\
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2014-09-17
    • 2016-10-15
    • 2015-02-21
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多