根据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()
我还是一个pygame新手,所以如果您不确定如何解决这个特定问题,但要认识到其他可以改善的事情,或者如果您需要更多信息制定解决方案,请告诉我!
答案 0 :(得分:1)
你总是把所有的按钮都搞定 - 在每个循环中 - 所以为什么shoud会更糟?
您可以使用display_menu = True
,display_game = True
,display_options = False
等变量来控制显示的元素 - silimiar到clicked_options
。
但更清洁的是为每个场景创建独立的while True
循环 - Menu
,Game
,Option
。
您可以使用示例中的功能:https://stackoverflow.com/a/47460947/1832058
它使用front_page()
,menu()
为两个不同的场景运行不同的while True
循环。
或者您可以为不同的场景/阶段创建课程:stage-example
你可以在图片上看到这个: