Проблема в том, что основной l oop ссылается на BackHelpRect
до того, как он будет определен. Это легко повторить, просто выберите пункт меню «назад» на первом экране. Для отладки я добавил print( "BackHelp Defined HERE" )
к функции BackHelp()
. Он не всегда вызывается заранее.
Чтобы исправить это, возможно, ваш код может определить все эти Изображения и Rects сразу, прежде чем начнется обработка меню. Что-то вроде:
def preloadButtons():
global HelpButton, HelpButtonRect
global BackHelpButton, BackHelpRect
# etc. etc.
HelpButton = pygame.image.load('button.jpg') # Open the custom button design.
HelpButton = pygame.transform.scale(HelpButton, (151, 51))
HelpButtonRect = HelpButton.get_rect()
HelpButtonRect.topleft = (335, 415)
BackHelpButton = pygame.image.load('button.jpg') # Open the custom button design.
BackHelpButton = pygame.transform.scale(BackHelpButton, (235, 84))
BackHelpButtonRect = BackHelpButton.get_rect()
BackHelpButtonRect.topleft = (45, 490)
Хранение всех этих кнопок в виде отдельных глобалов не очень хороший дизайн, и он уже вызывает сложность в рисовании и тестировании событий в остальной части программы. Было бы лучше упаковать все атрибуты (изображение, размер, положение, прямоугольник) кнопки в структуру данных. Это не обязательно должен быть Python class
, просто поместить свойства каждой кнопки в list
было бы шагом вперед, а затем, возможно, все эти списки в один список all_buttons
.
Например, здесь мы определяем список свойств кнопки, а затем перебираем их, чтобы создать более простой список имени кнопки / изображения / прямоугольника.
help_button = [ 'help', 'help_button.jpg', (151, 51), (335, 415) ]
back_help_button = [ 'back', 'back_button.jpg', (235, 84), ( 45, 490) ]
# ... TODO: rest of buttons
all_buttons_properties = [ help_button, back_help_button ]
# Initialise buttons
all_buttons = []
for butt in all_button_properties:
button_image = pygame.image.load( butt[1] ) # load
button_image = pygame.transform.scale( button_image, butt[2] ) # resize
button_rect = button_image.get_rect()
button_rect.topleft = butt[3] # move
all_buttons.append( butt[0], button_image, button_rect )
Это дает простой список all_buttons
списков [имя кнопки, изображение с измененным размером кнопки, прямоугольник с предварительно установленной кнопкой].
И, вероятно, вы хотите if
... elif
... для этих тестов кнопок, а не if
... if
...:
if event.type == pygame.MOUSEBUTTONDOWN:
if NextHelpRect.collidepoint(event.pos): # Button navigaton.
if MenuStatus == "Help menu 1":
MenuStatus = "Help menu 2"
Help()
if MenuStatus == "Help menu 2":
MenuStatus = "Help menu 3"
Help()
Что происходит, когда MenuStatus
равно «Меню справки 1» -> оно становится «Меню справки 2», но затем следующее if
меняет снова на «Меню справки 3»