Pygame UI清除和更新

时间:2017-12-07 09:34:25

标签: python user-interface pygame

根据Furas的要求,下面是我目前正在进行的Pygame项目中的代码段。我想要发生的事情本质上就像清除前一个窗口中可见的所有东西,这样我就可以重新开始使用新的UI。当代码运行时,"开始游戏"按钮在启动屏幕上按下,背景颜色更新,但之前呈现的所有内容(标题和所有按钮)仍保留在屏幕上。如果有人可以提供任何一般性指示 - 或基于以下代码的建议 - 这将是一个很大的帮助!

game_loop函数:

第一部分是我需要清除/更新屏幕的地方。 game_loop包含更多游戏逻辑,这与当前问题无关,下面粘贴的内容是与窗口交互的函数的唯一部分。

new_surface = pygame.Surface((1,1))

def game_loop():

      global clicked_game
      global game_running
      clicked_game = True
      game_running = True

      if clicked_game == True:
        screen.fill( (0,0,0) )

      screen.blit(new_surface, (0,0))
      pygame.display.update()

用户界面初始化和功能:

以下是game_loop中实际游戏逻辑后面的其余功能:

        def quit_game():
          pygame.quit()
          quit()


        def update_options():
          global clicked_options
          clicked_options = True 


        def button(window, msg, x_coord, y_coord, width, height, initial_colour, highlight_colour, button_action):
            mouse = pygame.mouse.get_pos()
            click = pygame.mouse.get_pressed()

            if x_coord + width > mouse[0] > x_coord and y_coord + height > mouse[1] > y_coord:
                pygame.draw.rect(window, highlight_colour, (x_coord, y_coord, width, height))
                if click[0] == 1:
                  button_action()
            else:
                pygame.draw.rect(window, initial_colour, (x_coord, y_coord, width, height))


            button_Text = pygame.font.Font("freesansbold.ttf",20)
            text_Surf, text_Rect = text_objects(msg, button_Text)
            text_Rect.center = ((x_coord + (width / 2)), (y_coord + (height / 2)))
            window.blit(text_Surf, text_Rect)

        while play:

          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                play = False

          button(screen, "Start Game", 231, 236, 250, 50, e_m_light, e_m_lighter, game_loop)
          button(screen, "Options", 231, 336, 250, 50, e_m_light, e_m_lighter, update_options)
          button(screen, "Exit", 231, 436, 250, 50, e_m_light, e_m_lighter, quit_game)

          if clicked_options == True:
            #update title colour for testing purposes
            text_Surface = Font1.render('BlackJack Blast!', True, e_m_lighter)
          else:
            text_Surface = Font1.render('BlackJack Blast!', True, white)

          screen.blit(textSurface,(106,100))
          pygame.display.update()

按下"开始游戏":

之前和之后的UI屏幕截图

User Interface - Before

User Interface - After

我还是一个pygame新手,所以如果您不确定如何解决这个特定问题,但要认识到其他可以改善的事情,或者如果您需要更多信息制定解决方案,请告诉我!

1 个答案:

答案 0 :(得分:1)

你总是把所有的按钮都搞定 - 在每个循环中 - 所以为什么shoud会更糟?

您可以使用display_menu = Truedisplay_game = Truedisplay_options = False等变量来控制显示的元素 - silimiar到clicked_options

但更清洁的是为每个场景创建独立的while True循环 - MenuGameOption

您可以使用示例中的功能:https://stackoverflow.com/a/47460947/1832058

它使用front_page()menu()为两个不同的场景运行不同的while True循环。

或者您可以为不同的场景/阶段创建课程:stage-example

你可以在图片上看到这个:

PyGame Schema #1