Проблема с кнопкой Pygame в функциональности - PullRequest
1 голос
/ 29 января 2020

Итак, я создаю меню для игры и сделал функцию кнопки. Кнопки работают, но только иногда:

  • Первая кнопка (для 2 игроков) работает при первом нажатии почти каждый раз
  • Вторая кнопка (для 1 игрока) работает меньше, чем, может быть, каждый 10 щелчков
  • Третья кнопка (Счета) труднее заставить работать, чем другие

Это не имеет смысла для меня, поскольку все кнопки используют одну и ту же функцию:

def button(msg,x,y,h):
  mouse = pygame.mouse.get_pos()
  click = pygame.mouse.get_pressed()

  pygame.draw.rect(screen, RED, (x,y, BUTTON_WIDTH, h))
  smallText = pygame.font.Font("freesansbold.ttf", 20)
  textSurf, textRect = text_objects(msg, smallText, WHITE)
  textRect.center = ((x+(BUTTON_WIDTH/2)),(y+(h/2)))
  screen.blit(textSurf, textRect)

  for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()

    if x+BUTTON_WIDTH > mouse[0] > x and y+h > mouse[1] > y:
      pygame.draw.rect(screen, BRIGHT_RED, (x,y, BUTTON_WIDTH, h))
      screen.blit(textSurf, textRect)
      if click[0] == 1:
        return True

def intro_screen():
  intro = True
  while intro:
    screen.fill(GREEN)
    if button("2-Player",245,145,BUTTON_HEIGHT):
      multiplayer_loop()
    if button("1-Player",245,270,BUTTON_HEIGHT):
      login_screen(True)
    if button("Scores",245,395,40):
      login_screen(False)
    screen.blit(TITLE, (120, 5))

    pygame.display.update()

pygame.init()
intro_screen()

Вот как выглядит меню

Любая помощь будет принята с благодарностью, спасибо.

1 Ответ

1 голос
/ 29 января 2020

Проблема в событии l oop в функции кнопки. Обратите внимание, pygame.event.get() получает все сообщения и удаляет их из очереди.
Таким образом, 1 кнопка (в основном 1-я кнопка) будет получать события, а другие кнопки - нет Мероприятия.

Удалить pygame.event.get() с кнопки. Получите события в главном приложении l oop и передайте список событий функции кнопки.

В любом случае вам вообще не понадобится событие l oop в функции кнопки, потому что вы оцениваете состояние кнопок на pygame.mouse.get_pressed().
Но я рекомендую использовать событие MOUSEBUTTONDOWN. См. pygame.event.

def button(events,msg,x,y,h):
    smallText = pygame.font.Font("freesansbold.ttf", 20)
    textSurf, textRect = text_objects(msg, smallText, WHITE)
    textRect.center = button_rect.center

    mouse       = pygame.mouse.get_pos()
    button_rect = pygame.Rect(x, y, BUTTON_WIDTH, h)
    hit         = button_rect.collidepoint(mouse)

    pygame.draw.rect(screen, BRIGHT_RED if hit else RED, button_rect)
    screen.blit(textSurf, textRect)

    if hit:
        for event in events:
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                return True
def intro_screen():
    intro = True
    while intro:

        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                sys.exit()

        screen.fill(GREEN)
        if button(events , "2-Player",245,145,BUTTON_HEIGHT):
            multiplayer_loop()
        if button(events , "1-Player",245,270,BUTTON_HEIGHT):
            login_screen(True)
        if button(events , "Scores",245,395,40):
            login_screen(False)
        screen.blit(TITLE, (120, 5))

        pygame.display.update()

Обратите внимание, что должен быть только 1 вызов pygame.event.get() на кадр.

...