Почему событие всегда pygame.MOUSEBUTTONDOWN в этой ситуации? - PullRequest
1 голос
/ 12 января 2020

Я нахожусь на заключительной части массивного проекта для школы. Я создаю игру Simon, где вы должны запомнить цвета и щелкнуть их в правильном порядке.

После моих анимаций для квадратов fla sh у меня 'usergottaclick' установлено значение true.

if other == True:
 #And if event = Mousebuttondown
            if usergottaclick == False:
                if mousex >= 50 and mousex <= 150 and mousey >= 110 and mousey <= 160:
                    randomnum = random.randint(1,4)
                    addtosimons()

                    for i in range (0, roundnum):

                        if simonslist[i] == 1:
                            #Flashes red square

                        if simonslist[i] == 2:
                            #Flashes blue square

                        if simonslist[i] == 3:
                            #Flashes green square

                        if simonslist[i] == 4:
                            #Flashes yellow square

                    addroundnum()
                    usergottaclick = True

Это мой код, когда пользователи поворачиваются, чтобы щелкнуть квадраты :

def usersturn():
#This code is under if event = pygame.MOUSEBUTTONDOWN
global usergottaclick
if usergottaclick == True:
    playerchoicelist = []
    for i in range (0, roundnum -1 ):

        if mousex >=200 and mousex <= 600 and mousey >= 0 and mousey <= 375:
            clicknum = 1
            playerchoicelist.append(clicknum)
            pygame.draw.rect(screen, REDLIGHT, [200, 0, 400, 375])
            pygame.display.update()
            pygame.time.delay(500)
            if playerchoicelist[i] != simonslist[i]:
                print("Wrong")
                changeusergottaclick()
                subtractroundnum()

        if mousex >=600 and mousex <= 1000 and mousey >= 0 and mousey <= 375:
            clicknum = 2
            playerchoicelist.append(clicknum)
            pygame.draw.rect(screen, BLUELIGHT, [600, 0, 400, 375])
            pygame.display.update()
            pygame.time.delay(500)
            if playerchoicelist[i] != simonslist[i]:
                print("Wrong")
                changeusergottaclick()
                subtractroundnum()

        if mousex >=200 and mousex <= 600 and mousey >= 375 and mousey <= 750:
            clicknum = 3
            playerchoicelist.append(clicknum)
            pygame.draw.rect(screen, GREENLIGHT, [200, 375, 400, 375])
            pygame.display.update()
            pygame.time.delay(500)
            if playerchoicelist[i] != simonslist[i]:
                print("Wrong")
                changeusergottaclick()
                subtractroundnum()


        if mousex >=600 and mousex <= 1000 and mousey >= 375 and mousey <= 750:
            clicknum = 4
            playerchoicelist.append(clicknum)
            pygame.draw.rect(screen, YELLOWLIGHT, [600, 375, 400, 375])
            pygame.display.update()
            pygame.time.delay(500)
            if playerchoicelist[i] != simonslist[i]:
                print("Wrong")
                changeusergottaclick()
                subtractroundnum()




        else:
            changeusergottaclick()

На что нужно обратить внимание, так это на то, что квадрат, по которому щелкает пользователь, добавляется в playerchoicelist.

Но когда я запускаю это, он действует так, как будто событие всегда pygame.mousebuttondown и просто щелкает квадрат столько раз, сколько позволяет l oop (столько раз, сколько установлено roundnum).

Как получить его, чтобы они могли только щелкнуть по одному квадрату за раз, а затем нужно щелкнуть еще раз, чтобы щелкнуть другой?

Большое спасибо всем, кто помогает, это для моей оценки.

1 Ответ

1 голос
/ 13 января 2020

Код, похоже, пытается «подтолкнуть» пользователя, а не просто реагирует на клики, когда они происходят. Нет 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()
...