Search code examples
pythonpygamepause

How can my Pause display work properly in Pygame?


So my pause display keeps returning after I click on the button which continues everything.

This is included in the code: "def paused(): global pause clock = pygame.time.Clock()"

while pause:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    screen.fill(0)
    screen.blit(intropic, (0, 0))

    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    # print(mouse)

    if 270 + 120 > mouse[0] > 270 and 590 + 50 > mouse[1] > 590:
        pygame.draw.rect(screen, (0, 0, 0), (268, 588, 124, 54))
        pygame.draw.rect(screen, (0, 255, 0), (270, 590, 120, 50))
        if click[0] == 1:
            pause = False

    else:
        pygame.draw.rect(screen, (0, 0, 0), (268, 588, 124, 54))
        pygame.draw.rect(screen, (100, 255, 100), (270, 590, 120, 50))

    if 770 + 150 > mouse[0] > 770 and 590 + 50 > mouse[1] > 590:
        pygame.draw.rect(screen, (0, 0, 0), (768, 588, 154, 54))
        pygame.draw.rect(screen, (255, 0, 0), (770, 590, 150, 50))
        if click[0] == 1:
            pygame.quit()
            exit()

    else:
        pygame.draw.rect(screen, (0, 0, 0), (768, 588, 154, 54))
        pygame.draw.rect(screen, (255, 100, 100), (770, 590, 150, 50))

    healthfont = pygame.font.Font(None, 40)
    start = healthfont.render("Weiter", True, (0, 0, 0))
    textRect1 = start.get_rect()
    textRect1.topright = [370, 603]
    screen.blit(start, textRect1)

    healthfont = pygame.font.Font(None, 40)
    end = healthfont.render("Beenden", True, (0, 0, 0))
    textRect1 = end.get_rect()
    textRect1.topright = [900, 603]
    screen.blit(end, textRect1)

    pausefont = pygame.font.Font(None, 80)
    pausetxt = pausefont.render("Pause", True, (0, 0, 0))
    textRect1 = pausetxt.get_rect()
    textRect1.center = [800, 300]
    screen.blit(pausetxt, textRect1)
    pygame.display.flip()

This is the code if you press P:

    if keys[4]:
        pause = True
        paused()

There is also a global pause = False

any help is much appreciated


Solution

  • Being paused or not paused, it's just a boolean. Your program must decide what that means.

    Perhaps it means that the screen is not updated, and perhaps input-handling is different.

    Below is a re-working of your code where if the paused flag global_paused ever gets set, the screen stops painting everything except a "*** PAUSED ***" banner.

    Note the use of pyagme.Rect to store rectangles, constants for colours, an simpler testing of collisions. Fonts only need to be loaded once, so these have been moved outside the main loop.

    global_paused = False
    
    BLACK    = (0, 0, 0)
    RED      = (0, 255, 0)
    GREENISH = (100, 255, 100)
    
    area1 = pygame.Rect( 268, 588, 124, 54 )
    area2 = pygame.Rect( 270, 590, 120, 50 )
    
    area3 = pygame.Rect(768, 588, 154, 54)
    area4 = pygame.Rect(770, 590, 150, 50)
    
    healthfont = pygame.font.Font(None, 40)
    start = healthfont.render("Weiter", True, BLACK )
    textRect1 = start.get_rect()
    textRect1.topright = [370, 603]
    
    healthfont = pygame.font.Font(None, 40)
    end = healthfont.render("Beenden", True, BLACK )
    textRect1 = end.get_rect()
    textRect1.topright = [900, 603]
    
    pausefont = pygame.font.Font(None, 80)
    pausetxt = pausefont.render("Pause", True, BLACK )
    textRect1 = pausetxt.get_rect()
    textRect1.center = [800, 300]
    
    pause_mode = pausefont.render( "*** PAUSED ***", True, RED, BLACK )
    
    
    clock = pygame.time.Clock()
    exiting = False
    while not exiting:
    
        mouse_click = None
        mouse_pos   = pygame.mouse.get_pos()
    
        # Handle Events
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
            elif ( event.type == pygame.MOUSEBUTTONUP ):
                mouse_click = pygame.mouse.get_pressed()
                if ( area1.collidepoint( event.pos ) ):
                    global_paused = not global_paused
                elif ( area3.collidepoint( event.pos ) ):
                    exiting = True
            elif ( event.type == pygame.KEYUP ):
                if ( event.key == pygame.K_p ):
                    global_paused = not global_paused
    
        # draw the screen
        screen.fill( BLACK )
        
        if ( not global_paused ):
            screen.blit(intropic, (0, 0))
    
            pygame.draw.rect(screen, BLACK, area1 )
            if ( area1.collidepoint( mouse_pos ) ):
                pygame.draw.rect(screen, RED, area2 )
            else:
                pygame.draw.rect(screen, GREENISH, area2 )
    
            pygame.draw.rect(screen, BLACK, area3 )
                pygame.draw.rect(screen, RED, area4 )
            else:
                pygame.draw.rect(screen, GREENISH, area4 )
    
            screen.blit(start, textRect1)
            screen.blit(end, textRect1)
            screen.blit(pausetxt, textRect1)
        
        else:
            # everything is paused
            screen.blit( pause_mode, ( 0, 0 ) )
        
        pygame.display.flip()
        clock.tick( 60 )
        
    pygame.quit()