繁体   English   中英

如何停止 pygame 图片重叠

[英]How do I stop pygame pictures overlapping

#in the game loop
if event.key == pygame.K_p:
    paused = True
    pause_menu(paused, sound_state)

    if updated_sound_state:
        sound_state = True
        mixer.music.unpause()
    elif not updated_sound_state:
        sound_state = False
        mixer.music.pause()

#the pause menu
def pause_menu(paused, sound_state):
    global updated_sound_state
    updated_sound_state = sound_state

    mixer.music.pause()

    if updated_sound_state:
        screen.blit(sound_on_image, (5, (display_height - sound_image_y_size)))
    if not updated_sound_state:
        screen.blit(sound_off_image, (5, (display_height - sound_image_y_size)))

    while paused:
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_p:
                    paused = False

                if event.key == pygame.K_s:
                    if sound_state:
                        updated_sound_state = False
                        paused = False
                        pause_menu(paused=True, sound_state=updated_sound_state)
                    elif not sound_state:
                        updated_sound_state = True
                        paused = False
                        pause_menu(paused=True, sound_state=updated_sound_state)

    return sound_state

当我打开暂停菜单时,它会显示正确的图像,但是当我打开或关闭声音时,它会显示两个图像。

当我退出暂停并 go 重新暂停时,它确实显示了正确的图像。

我该如何解决?

不要递归调用pause_menu 您必须在每一帧中清除绘制场景。 获取 ` 之前的屏幕copy

current_screen = screen.copy()

在暂停循环中对副本进行blit并在其上绘制菜单:

screen.blit(current_screen, (0, 0))     
if updated_sound_state:
    screen.blit(sound_on_image, (5, (display_height - sound_image_y_size)))
if not updated_sound_state:
    screen.blit(sound_off_image, (5, (display_height - sound_image_y_size)))
pygame.display.update()

完成pause_menu function:

def pause_menu(paused, sound_state):
    global updated_sound_state
    updated_sound_state = sound_state

    mixer.music.pause()

    current_screen = screen.copy()

    while paused:
    
        for event in pygame.event.get():
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_p:
                    paused = False

                if event.key == pygame.K_s:
                    if sound_state:
                        updated_sound_state = False
                        paused = False
                    elif not sound_state:
                        updated_sound_state = True
                        paused = False
                    
        screen.blit(current_screen, (0, 0))     
        if updated_sound_state:
            screen.blit(sound_on_image, (5, (display_height - sound_image_y_size)))
        if not updated_sound_state:
            screen.blit(sound_off_image, (5, (display_height - sound_image_y_size)))
        pygame.display.update()

    return sound_state

典型的 PyGame 应用循环必须:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM