首页 > 解决方案 > PyGame 主菜单错误

问题描述

首先对我糟糕的英语感到抱歉。我想用pygame做一个乒乓球比赛。我做这些:单人模式,双人模式,主菜单和暂停菜单。我可以在玩游戏时进入暂停菜单,这里没有问题。我可以继续游戏,这里也没有问题。但我无法进入主菜单。当我单击主菜单按钮时,我进入双人模式。

如果声明:

 if 462+225 > mouse[0] > 462 and 363+100 > mouse[1] > 363:
      pygame.draw.rect(display,(250,250,250), (462,363,225,100))

      mainmenutext=font.render("Main Menu", True, (0,0,0))
      mainmenutextRect=mainmenutext.get_rect()
      mainmenutextRect.center=(575, 410)
      display.blit(mainmenutext, mainmenutextRect)

      if click[0]==1
           mainmenu()

我正在尝试使用此代码返回主菜单,但它不工作它是输入 doubleplayer() 函数,我找不到错误。

这是主菜单功能:

def mainmenu():
    while menu:
        for event in pygame.event.get():
            #print(event)
            if event.type==pygame.QUIT:
                pygame.quit()
                quit()

        display.fill((0,0,0))
        largefont=pygame.font.Font('data/BalooBhai-Regular.ttf',50)
        maintext=largefont.render("Ping Pong", True, (255,255,255))
        maintextRect=maintext.get_rect()
        maintextRect.center=(400,200)
        display.blit(maintext, maintextRect)

        #Button
        mainmenuoptionsfont=pygame.font.Font(None,30)

        pygame.draw.rect(display, (255,255,255), (100,350,250,125))
        pygame.draw.rect(display, (0,0,0), (112,363,225,100))

        singletext=mainmenuoptionsfont.render("Single Player", True, (255,255,255))
        singleRect=singletext.get_rect()
        singleRect.center=(225,410)
        display.blit(singletext, singleRect)


        pygame.draw.rect(display,(255,255,255), (450,350,250,125))
        pygame.draw.rect(display,(0,0,0), (462,363,225,100))

        dobuletext=mainmenuoptionsfont.render("Double Player", True, (255,255,255))
        doubletextRect=doubletext.get_rect()
        doubletextRect.center=(575, 410)
        display.blit(doubletext, doubletextRect)



        mouse=pygame.mouse.get_pos()
        #print(mouse)
        click=pygame.mouse.get_pressed()
        #print(click)



        if 112+225 > mouse[0] > 112 and 363+100 > mouse[1] > 363: #on hover
            pygame.draw.rect(display, (250,250,250), (100,350,250,125))

            singletext=mainmenuoptionsfont.render("Single Player", True, (0,0,0))
            singleRect=singletext.get_rect()
            singleRect.center=(225,410)
            display.blit(singletext, singleRect)

            if click[0]==1: #if click
                singleplayer()


        if 462+225 > mouse[0] > 462 and 363+100 > mouse[1] > 363: #on hover

            pygame.draw.rect(pencere,(250,250,250), (462,363,225,100))

            doubletext=mainmenuoptionsfont.render("Double Player", True, (0,0,0))
            doubletextRect=doubletext.get_rect()
            doubletextRect.center=(575, 410)
            display.blit(doubletext, doubletextRect)

            if click[0]==1: #if click
                doubleplayer()






        pygame.display.update()



对不起,我的英语不好 :(

标签: pythonpygame

解决方案


我认为你处理这个有点不必要的复杂。我做菜单按钮的方式是这样的:

  1. 创建按钮文本,然后在其周围创建一个矩形(可见或不可见,无关紧要)。这是最简单的使用self.button1 = pygame.Rect(x, y, w, w).

  2. Blit 屏幕上的按钮和文本。

  3. 然后在事件循环中检查事件点击,如下所示:

    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
    
            if self.button1.collidepoint(pos):
                print('Do what the button is supposed to do')
    

您还复制了很多代码。创建一个处理文本/按钮的函数,如下所示。“boxed”属性提供了一个选项,可以在文本周围创建一个可见的矩形。

    def create_button(self, text, font, color, x, y, boxed):
        text = font.render(text, True, color)
        rect = text.get_rect()
        rect.center = (x, y)
        if boxed:
            box = (rect[0] - PADDING, rect[1] - PADDING/2, rect[2] + PADDING*2, rect[3] + PADDING)
            pygame.draw.rect(self.win, WHITE, box, int(PADDING/2))
        self.win.blit(text, rect)

        return rect

然后,您只需使用以下代码创建按钮:

self.button1 = self.create_button('Text 1', FONT, COLOR, X-COORDINATE, Y-COORDINATE, True)
self.button2 = self.create_button('Text 2', FONT, COLOR, X-COORDINATE, Y-COORDINATE, True)

推荐阅读