pygame的:奇怪的blitting错误(Pygame: Weird blitting bug)

2019-06-25 09:07发布

我一直一个简单的主菜单上在Python 3.1和2.7 pygame的。 当鼠标光标是在一定区域内,在屏幕上的文字应该成为白色。 我使用的功能做块屏幕。 第一个函数的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”它会改变颜色。 在我加入加载游戏的东西,它会改变颜色,但现在只加载游戏的意愿。 为什么它不工作任何想法?

顺便说一句,我必须在比赛中循环,更新屏幕的代码。 我也有代码来设置字体。

Answer 1:

菜单被绘制两次。 当鼠标校验码计算光标位于NEW GAME, draw_main_menu_ng 正在被呼叫。 然而,检查仍在继续,当判断光标不在 LOAD GAME,它也要求draw_main_menu ,否定调用的效果draw_main_menu_ng

一个最小的解决办法是return曾经光标是一个选项里面:

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

另一种解决方案

我已经添加的我会怎样做的一大亮点,能够菜单一个完整的例子 。 我意识到这是远远超过你所要求的事情,但如果你只是增加了一个return语句的代码,您可能会遇到其他问题之后。 我做了完整的例子,所以你可以看到一个很好的方式,以避免使用文字和几乎相同的语句。 我感觉很舒服发布它,因为你必须要了解它把它整合到游戏中。



Answer 2:

if语句,而不是所有的,它会更容易使周围的文本正确,而且使用功能rect.collidepoint((X,Y))(返回布尔)。 它会使你的代码更短,可能更快。



文章来源: Pygame: Weird blitting bug
标签: python pygame