проблема с pygame

При нажатии на кнопку alb1_rect появляется уровень игры, но при отпускании кнопки уровень игры пропадает и возвращается меню выбора уровня

if alb1_rect.collidepoint(pos) and pygame.mouse.get_pressed()[0] == True:
            window.blit(background1, [0, 0])
            for i in range(len(map_now)):
                for j in range(len(map_now[i])):
                    
                    map_now = map
                    
                    if map_now[i][j] == '*':
                        platform_rect = platform_img.get_rect()
                        platform_rect.x = platform_rect.width * j + test
                        platform_rect.y = platform_rect.height * i + testy
                        platforms.append(platform_rect)
                        window.blit(platform_img, platform_rect)
                    if map_now[i][j] == '-': 
                        dirt_rect = dirt_img.get_rect()
                        dirt_rect.x = dirt_rect.width * j + test
                        dirt_rect.y = dirt_rect.height * i + testy
                        dirts.append(dirt_rect)
                        window.blit(dirt_img, dirt_rect)    
            man_rect.x += change_x

много всего перепробовал, но не получается


Ответы (1 шт):

Автор решения: Rijen

Вам необходимо зафиксировать состояние нажатия вне условия. Если я правильно понимаю alb1_rect.collidepoint(pos) - это положение указателя на кнопке уровня, то код должен выглядеть так.

level_selected = False #объявить до игрового цикла
...
if alb1_rect.collidepoint(pos) and pygame.mouse.get_pressed()[0] == True:
  level_selected = True
if level_selected:
   ...
   # установите level_selected =False, при необходимых условиях.

В архитектуре, которая базируется на бесконечном цикле (в частности, графические игры, где метод может быть вызван в каждой итерации) есть понятие состояний (state), например, текущий экран - меню, уровень, таблица рейтингов.

В отличии от линейного кода, вы должны помнить, что вы в цикле, и ваш код должен отрабатывать только в определенных состояниях.

Причем, первую установку level_selected =False необходимо выполнить вне цикла, чтобы состояние у вас не сбрасывалось каждый кадр.

Немного иной пример:

import pygame

pygame.init()

state = "level_menu"
...

while True:
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()
        if i.type == pg.MOUSEBUTTONDOWN and i.button == 1:
          mouse_pos = pygame.mouse.get_pos
             if state == "level_menu":
                if lvl1_btn.collidepoint(mouse_pos):
                   state="level_seleted"
                   current_level=1
    
    if state=="level_selected":
      #ваш код уровня
→ Ссылка