Я не все изменил.
Избегайте множественных циклов событий в приложении l oop. Обратите внимание, что pygame.event.get()
удаляет все сообщения из очереди. Таким образом, либо первое, либо второе событие l oop получит события. Но не обе петли. Вы можете избавиться от этого, получая события один раз в циклах и используя список событий несколько раз:
while mainLoop:
events = pygame.event.get()
# [...]
if button01collidepoint:
switchButton01(events)
# [...]
for event in events:
# [...]
Если вы хотите, чтобы изображение оставалось на экране, вы должны нарисовать его в каждый кадр. Добавьте a, в котором хранится положение кнопки buttonPlusPos
, и нарисуйте положение в главном приложении l oop. Функция switchButton01
должна возвращать позицию:
buttonPlusPos = None
while mainLoop:
# [...]
if button01collidepoint:
buttonPlusPos = switchButton01(events, buttonPlusPos)
if buttonPlusPos:
screen.blit(buttonPlusImage, buttonPlusPos)
Функция switchButton01
не blit
кнопка, она просто возвращает позицию. Кроме того, список событий передается в функцию, и функция обрабатывает события в списке, а не извлекает свой «собственный» список. В любом случае позиция изображения возвращается. Либо новая позиция, либо текущая позиция (которая может быть None
):
def switchButton01(events, buttonPlusPos):
global button02
button02 = pygame.transform.scale(button02, (100, 100))
screen.blit(button02, [580, 350])
for event in events:
if event.type == pygame.MOUSEBUTTONDOWN:
global clickNum
clickNum += 1
return (random.randrange(560, 680), random.randrange(330, 450))
return buttonPlusPos
Полный код:
import pygame
import random
pygame.init()
# variables
mainLoop = True
font = pygame.font.SysFont('comicsansms', 25)
white = [255, 255, 255]
green = [0, 150, 0]
gray = [140, 140, 140]
black = [0, 0, 0]
clickNum = 0
clickAmount = 1
FPS = pygame.time.Clock()
screen = pygame.display.set_mode((1300, 700))
# functions
def switchButton01(events, buttonPlusPos):
global button02
button02 = pygame.transform.scale(button02, (100, 100))
screen.blit(button02, [580, 350])
for event in events:
if event.type == pygame.MOUSEBUTTONDOWN:
global clickNum
clickNum += 1
return (random.randrange(560, 680), random.randrange(330, 450))
return buttonPlusPos
# load images
button01 = pygame.image.load('button_100.png')
button02 = pygame.image.load('button_100hovered.png')
icon = pygame.image.load('icon_128.png')
buttonPlusImage = pygame.image.load('buttonPlus_32.png')
# window itself and icon
pygame.display.set_caption("incremental adventures")
pygame.display.set_icon(icon)
buttonPlusPos = None
while mainLoop:
pygame.display.flip()
FPS.tick(144)
screen.fill(white)
events = pygame.event.get()
# actual content in the game
button01 = pygame.transform.scale(button01, (100, 100))
screen.blit(button01, [580, 350])
click_counter_text = font.render("Click counter: ", True, black, white)
screen.blit(click_counter_text, [525, 50])
button01rect = button01.get_rect(center=(630, 400))
button01collidepoint = button01rect.collidepoint(pygame.mouse.get_pos())
click_counter = font.render((str(clickNum)), True, black, white)
screen.blit(click_counter, [700, 50])
if button01collidepoint:
buttonPlusPos = switchButton01(events, buttonPlusPos)
if buttonPlusPos:
screen.blit(buttonPlusImage, buttonPlusPos)
# quits
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
pygame.quit()
quit()