Код, похоже, пытается «подтолкнуть» пользователя, а не просто реагирует на клики, когда они происходят. Нет roundnum
событий мыши, как правило, по одному. Обрабатывайте каждое событие так, как оно происходит.
В управляемой событиями программе (т. Е. 99% всех программ Pygame) обычно рекомендуется обрабатывать их как события в реальном времени и использовать системное время для определить, когда что-то должно произойти в будущем. Это позволяет коду не использовать pygame.time.delay()
и дает гораздо лучший поток пользовательскому интерфейсу.
Код ниже dr aws ваши "simon" прямоугольники, используя простой список списков структура данных для хранения каждого прямоугольника, его имя, цвета и время последнего нажатия. Хранение всех ваших данных прямоугольника в списке, подобном этому, позволяет программе l oop над списком, выполняя одинаковый код для каждой кнопки. Чем меньше кода, тем меньше вероятность ошибок, а код становится проще и чище. Всякий раз, когда вы обнаруживаете, что копируете блоки кода, а затем вносите простые изменения, лучше остановиться на минуту и задуматься, а нет ли лучшего способа. Сохранение объекта Pygame Rect
также позволяет выполнять простое обнаружение столкновений.
Таким образом, поле времени кнопки (изначально нулевое) используется для определения необходимости рисования прямоугольника в базовом цвете или выделении цветом. цвет. При нажатии кнопки текущее время сохраняется в кнопке. Когда кнопка затем отображается на экране, если она по-прежнему составляет LIGHT_TIME
миллисекунд с момента нажатия, она выделяется подсвеченной.
import pygame
pygame.init()
WINDOW_WIDTH = 1000
WINDOW_HEIGHT = 1000
FPS = 60
RED = ( 200, 0, 0 )
BLUE = ( 0, 0, 200 )
YELLOW = ( 200, 200, 0 )
GREEN = ( 0, 200, 0 )
LIGHTRED = ( 255, 0, 0 )
LIGHTBLUE = ( 0, 0, 255 )
LIGHTYELLOW = ( 255, 255, 0 )
LIGHTGREEN = ( 0, 255, 0 )
LIGHT_TIME = 300 # milliseconds the button stays hghlighted for
# define the on-screen button areas & colour
# name base pressed click rectangle
# colour colour time
buttons = [ [ "red", RED, LIGHTRED, 0, pygame.Rect( 200, 0, 400, 375 ) ],
[ "blue", BLUE, LIGHTBLUE, 0, pygame.Rect( 600, 0, 400, 375 ) ],
[ "green", GREEN, LIGHTGREEN, 0, pygame.Rect( 200, 375, 400, 375 ) ],
[ "yellow", YELLOW, LIGHTYELLOW, 0, pygame.Rect( 600, 375, 400, 375 ) ] ]
# ---------- Main ----------
screen = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ) )
clock = pygame.time.Clock()
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
elif ( event.type == pygame.MOUSEBUTTONUP ):
mouse_pos = event.pos
for i, b in enumerate( buttons ): # for every button
name, base_colour, pressed_colour, click_time, butt_rect = b # get the button's parts
if ( butt_rect.collidepoint( mouse_pos ) ): # was the mouse-click inside this?
print( "Button [" + name + "] pressed" )
buttons[i][3] = pygame.time.get_ticks() # update the button's click-time
time_now = pygame.time.get_ticks() # get the current time (in milliseconds)
for b in buttons: # for every button
name, base_colour, pressed_colour, click_time, butt_rect = b # get the button's parts
if ( click_time > 0 and click_time + LIGHT_TIME > time_now ): # if the mouse-click was LIGHT_TIME ms before time-now
colour = pressed_colour # light-up colour # colour the button light
else: # otherwise,
colour = base_colour # base colour # colour the button normally
pygame.draw.rect( screen, colour, butt_rect, 0 ) # draw a filled rectangle in the colour, for the button
pygame.display.update()
clock.tick(FPS)
pygame.quit()