Skip to main content
 首页 » 编程设计

python之Pygame:奇怪的 blitting 错误

2025年05月04日9myhome

我一直在使用 Python 3.1 和 PyGame 2.7 开发一个简单的主菜单。当鼠标光标在某个区域内时,屏幕上的文本应该变成白色。我正在使用函数来阻塞屏幕。第一个函数正常地 blit 主菜单,另外两个函数 blit 菜单并突出显示一些文本。 以下是函数:

def draw_main_menu(): #draw main menu normally 
    screen.fill(BLACK) #clears screen 
 
    #set up text 
    new_text = menu_font.render('NEW GAME', 1, (100, 100, 100)) 
    load_text = menu_font.render('LOAD GAME', 1, (100, 100, 100)) 
    options_text = menu_font.render('OPTIONS', 1, (100, 100, 100)) 
    quit_text = menu_font.render('QUIT', 1,  (100, 100, 100)) 
 
    #blit text 
    screen.blit(new_text, (340, 425)) 
    screen.blit(load_text, (335, 455)) 
    screen.blit(options_text, (350, 485)) 
    screen.blit(quit_text, (373, 515)) 
 
def draw_main_menu_ng(): #draw main menu with new game text in white 
    screen.fill(BLACK) 
 
    new_text = menu_font.render('NEW GAME', 1, (255, 255, 255)) 
    load_text = menu_font.render('LOAD GAME', 1, (100, 100, 100)) 
    options_text = menu_font.render('OPTIONS', 1, (100, 100, 100)) 
    quit_text = menu_font.render('QUIT', 1,  (100, 100, 100)) 
 
    screen.blit(new_text, (340, 425)) 
    screen.blit(load_text, (335, 455)) 
    screen.blit(options_text, (350, 485)) 
    screen.blit(quit_text, (373, 515)) 
 
def draw_main_menu_lg(): #draw main menu with load game text in white 
    screen.fill(BLACK) 
 
    new_text = menu_font.render('NEW GAME', 1, (100, 100, 100)) 
    load_text = menu_font.render('LOAD GAME', 1, (255, 255, 255)) 
    options_text = menu_font.render('OPTIONS', 1, (100, 100, 100)) 
    quit_text = menu_font.render('QUIT', 1,  (100, 100, 100)) 
 
    screen.blit(new_text, (340, 425)) 
    screen.blit(load_text, (335, 455)) 
    screen.blit(options_text, (350, 485)) 
    screen.blit(quit_text, (373, 515)) 

下面,我使用变量 x 和 y 来检查鼠标是否悬停在按钮上。第一组两个数字是 x 坐标的范围,第二组两个数字是 y 坐标的范围。

x,y = pygame.mouse.get_pos() 
#set up new game mouse positions 
if x >= 340 and x <= 465: 
    new_game_x_pos = True 
if x < 340  or x > 465: 
    new_game_x_pos = False 
 
if y >= 425 and y <= 445: 
    new_game_y_pos = True 
if y < 425 or y > 445: 
    new_game_y_pos = False 
 
if new_game_x_pos == True and new_game_y_pos == True: 
    draw_main_menu_ng() 
if new_game_x_pos == False or new_game_y_pos == False: 
    draw_main_menu() 
 
#set up load game mouse positions 
if x >= 335 and x <= 470: 
    load_game_x_pos = True 
if x < 335 or x > 470: 
    load_game_x_pos = False 
 
if y >= 455 and y <= 475: 
    load_game_y_pos = True 
if y < 455 or y > 475: 
    load_game_y_pos = False 
 
if load_game_x_pos == True and load_game_y_pos == True: 
    draw_main_menu_lg() 
if load_game_x_pos == False or load_game_y_pos == False: 
    draw_main_menu() 

出于某种原因,当鼠标悬停在“NEW GAME”上时,它不会改变颜色。当鼠标悬停在“LOAD GAME”上时,它会改变颜色。在我添加加载游戏的东西之前,它会改变颜色,但现在只有加载游戏才会。关于为什么它不起作用的任何想法?

顺便说一句,我在游戏循环中确实有更新屏幕的代码。我也有设置字体的代码。

请您参考如下方法:

菜单被绘制了两次。当鼠标检查代码评估光标位于 NEW GAME 上时,将调用 draw_main_menu_ng 。然而,检查继续进行,当它评估光标不在LOAD GAME上时,它还会调用draw_main_menu,否定调用的效果到 draw_main_menu_ng。

一个最小的解决方案是在光标位于选项内时返回:

if new_game_x_pos == True and new_game_y_pos == True: 
    draw_main_menu_ng() 
    return 

替代方案

我添加了 a full example of how I would make a highlight-able menu .我知道这比你问的要多得多,但如果你只是在你的代码中添加一个 return 语句,你可能会在之后遇到其他问题。我制作了完整的示例,因此您可以看到避免使用文字和几乎相同的语句的好方法。我觉得发布它很舒服,因为你必须理解它才能将它集成到游戏中。