【问题标题】:python pygame pause functionpython pygame暂停函数
【发布时间】:2019-11-30 23:47:39
【问题描述】:

我是初学者,我的代码有问题。在这里您可以看到我的代码的简短摘录。

这是我创建的一个简单的蛇游戏,但我试图添加一个暂停。我知道了,但是当我开始暂停时,我无法关闭它。

我的代码中可能有一个基本错误,所以我无法前进。我希望你能帮助我。

提前谢谢你!

def checkquit(e):
    running = True
    pause = False
    for ev in e:
        if ev.type == pygame.QUIT:
            exit(0)
            running = True

        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
            quit(0)
            running = True

        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_p:
            pause = False

    while pause:
        #running = False
        pause = True   
        red = (255,0,0)

        screen = pygame.display.set_mode((800,500))
        screen.fill((0,0,0))

        my_font = pygame.font.SysFont("monospace", 50)
        my_font_two = pygame.font.SysFont("monospace", 10)

        text1 = myfont.render("Pause!", 100, red)
        text2 = myfont.render("Please restart the game", 100, red)

        screen.blit(text2, (10, 200))
        screen.blit(text1, (230, 100))

        pygame.display.update()

        for ev in e:
            if ev.type == pygame.QUIT:
                pause = False
            if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
                pause = False      
            if ev.type == pygame.KEYDOWN and ev.key == pygame.K_p:
                pause = True

【问题讨论】:

  • 使用组合键“KEYDOWN+ESC”来取消暂停游戏是理想的行为吗?
  • 我正在尝试关闭我的暂停建议。当我按下键 p 时会出现暂停窗口,但如果我想关闭暂停窗口,它不会关闭
  • 但是根据您的代码,您取消暂停的关键事件使用 Escape,而不是 P:ev.key == pygame.K_ESCAPE: pause = False 由于您的代码只检查 KEYDOWN 事件,看起来游戏会在按住时取消暂停逃生,这可能会导致问题,因为逃生也会退出游戏。
  • 但是如果我将 K_ESCAPE 更改为 pause = True 也没关系。无论如何,当我按 p 键时,游戏就会暂停。
  • 暂停时按住 ESC 键会怎样?

标签: python pygame pause


【解决方案1】:

暂停屏幕显示在单独的应用程序循环中。您也必须在该循环中获取事件。请注意,在您的代码中,e 的内容在“暂停”循环中永远不会改变:

def checkquit(e):
    global running
    running = True
    pause = False
    for ev in e:
        if ev.type == pygame.QUIT:
            exit(0)
            running = True
        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
            quit(0)
            running = True
        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_p:
            pause = True

    while pause:

        # [...]


        # get the new events
        e = pygame.event.get()

        # handle the events in the loop
        for ev in e:
            if ev.type == pygame.QUIT:
                pause = False
            if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
                pause = False      
            if ev.type == pygame.KEYDOWN and ev.key == pygame.K_p:
                pause = True

runnung 似乎是全局命名空间中的一个变量。你必须使用global statement 来改变它的状态。 此外,在“暂停”循环中重新创建窗口表面是多余的。

screen = pygame.display.set_mode((800,500))


我建议更改游戏流程。使用 1 个应用程序循环。例如:

myfont=pygame.font.SysFont("monospace",50)
myfonttwo=pygame.font.SysFont("monospace",10)
text1=myfont.render("Pause!",100,red)
text2=myfont.render("Please restart the game",100,red)

def checkquit(e):
    global running, pause
    for ev in e:
        if ev.type == pygame.QUIT:
            exit(0)
            running = True
        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
            if pause:
                pause = False
            else:
                quit(0)
                running = True
        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_p:
            pause = not pause

running, pause = True, False
while running:
    events = pygame.event.get()
    checkquit(events)

    screen.fill((0,0,0))
    if pause:
        # draw pause screen
        screen.blit(text2,(10,200))
        screen.blit(text1,(230,100))

    else:
        # draw game
        # [...]

    pygame.display.update() 

【讨论】:

    【解决方案2】:

    我将我的代码编辑为这个:

    def checkquit(e): 运行=真 暂停 = 假 对于 e 中的 ev: 如果 ev.type == pygame.QUIT: 退出(0) 运行 = 假 暂停 = 假

        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE:
            quit(0)
            running = False
            pause = False
    
        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_p:
                pause = True
                running = False
    
    
    
    while pause: 
        pause = True
        red = (255,0,0)
        screen = pygame.display.set_mode((800,800))
        screen.fill((0,0,0))
        myfont=pygame.font.SysFont("monospace",50)
        myfonttwo=pygame.font.SysFont("monospace",10)
        myfonttwo=pygame.font.SysFont("monospace",10)
        text1=myfont.render("Pause!",100,red)
        text2=myfont.render("Please resume your game!",100,red)
        text3=myfont.render("Game starts in 10 seconds!",100,red)
        screen.blit(text2,(50,200))
        screen.blit(text1,(300,100))
        screen.blit(text3,(0,300))
    
        pygame.display.update()
        pygame.time.delay(4500)
        if ev.type == pygame.KEYDOWN and ev.key == pygame.K_p:
            pause = False
    

    而且效果很好!感谢您的建议!

    【讨论】:

    • 你知道我如何发布代码结果的图片吗?
    • 如果有人有兴趣查看我的整个代码,只需通过 github 检查我的用户名 zerokrezan
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多