Как правильно отображать паузу в Pygame?

Таким образом, мое отображение паузы продолжает возвращаться после того, как я нажимаю кнопку, которая продолжает все.

Это включено в код: 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()

Это код, если вы нажмете P:

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

Также есть глобальная пауза = False

Любая помощь высоко ценится


person JaMoin2020    schedule 26.11.2020    source источник
comment
Пожалуйста, рассмотрите возможность использования чего-то вроде butt_rect = pygame.Rect( 768, 588, 154, 54 ) для хранения этих прямоугольников, тогда вы можете использовать butt_rect.collidepoint( pygame.mouse.get_pos() ). Это убережет ваш основной цикл от перенасыщения числами.   -  person Kingsley    schedule 27.11.2020


Ответы (1)


Приостановлено или не приостановлено, это просто логическое значение. Ваша программа должна решить, что это значит.

Возможно, это означает, что экран не обновляется, и, возможно, обработка ввода отличается.

Ниже приведена переработка вашего кода, где, если когда-либо будет установлен флаг паузы global_paused, экран перестанет рисовать все, кроме баннера *** PAUSED ***.

Обратите внимание на использование pyagme.Rect для хранения прямоугольников, константы для цветов, более простое тестирование коллизий. Шрифты нужно загружать только один раз, поэтому они были перемещены за пределы основного цикла.

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()
    
person Kingsley    schedule 27.11.2020