Ошибка главного меню PyGame - PullRequest
0 голосов
/ 09 января 2020

Прежде всего, извините за мой плохой английский sh. Я хочу сделать игру в пинг-понг с использованием pygame. Я делаю это: режим одиночной игры, режим двойной игры, главное меню и меню паузы. Я могу войти в меню паузы во время игры, здесь нет проблем. Я могу продолжить игру, здесь тоже нет проблем. Но я не могу go главное меню. Когда я нажимаю кнопку главного меню, я go режим двойной игры.

Если утверждение:

 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()



Извините за мой плохой английский sh: (

1 Ответ

0 голосов
/ 15 января 2020

Я думаю, вы справляетесь с этим немного ненужным сложным. То, как я делаю кнопки меню, выглядит примерно так:

  1. Создайте текст кнопки, а затем создайте прямоугольник вокруг нее (видимый или не видимый, не имеет значения). Это проще всего сделать с помощью self.button1 = pygame.Rect(x, y, w, w).

  2. Блит кнопки и надписи на экране.

  3. В случае l oop я проверяю наличие кликов событий, например:

    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')
    

Вы также дублируете много кода. Создайте функцию, которая обрабатывает текст / кнопку, как показано ниже. Атрибут «в штучной упаковке» предназначен для создания видимого прямоугольника вокруг текста.

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...