проблема с 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 шт):
Вам необходимо зафиксировать состояние нажатия вне условия.
Если я правильно понимаю 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":
#ваш код уровня