Поиск…


Контур события

Pygame будет регистрировать все события от пользователя в очередь событий, которые могут быть получены с помощью кода pygame.event.get() . Каждый элемент в этой очереди является объектом Event и все они будут иметь type атрибута, который представляет собой целое число, представляющее, какое событие он имеет. В модуле pygame есть предопределенные целочисленные константы, представляющие тип. За исключением этого атрибута, события имеют разные атрибуты.

Постоянное имя Атрибуты
УВОЛИТЬСЯ никто
ActiveEvent прибыль, состояние
KeyDown unicode, key, mod
KeyUp ключ, мода
MOUSEMOTION pos, rel, кнопки
MOUSEBUTTONUP pos, кнопка
MOUSEBUTTONDOWN pos, кнопка
JOYAXISMOTION радость, ось, значение
JOYBALLMOTION радость, мяч, rel
JOYHATMOTION радость, шляпа, ценность
JOYBUTTONUP радость, кнопка
JOYBUTTONDOWN радость, кнопка
VIDEORESIZE размер, w, h
VIDEOEXPOSE никто
USEREVENT код

пример

Чтобы обрабатывать наши события, мы просто просматриваем очередь, проверяем, какой тип (с помощью предопределенных констант в модуле pygame), а затем выполняем некоторые действия. Этот код проверяет, нажал ли пользователь кнопку закрытия в верхнем углу дисплея, и если это так прекратит работу программы.

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        # Close the program any way you want, or troll users who want to close your program.
        raise SystemExit

ВНИМАНИЕ : вы должны регулярно вызывать очередь событий при использовании pygame! Помимо выборки доступных событий, вызов очереди событий также является способом взаимодействия pygame с операционной системой. Если очередь событий не вызывается регулярно, ваша операционная система будет считать, что ваша программа больше не работает, и, возможно, она выглядит так, как если бы программа потерпела крах (в Windows это окно становится белым). Если вы не хотите ничего делать с событиями, вы должны вызвать pygame.event.pump() каждый цикл игры, чтобы pygame обрабатывал события внутри.


События на клавиатуре

В pygame есть два типа ключевых событий: KEYDOWN и KEYUP . Эти события имеют key атрибута, который является целым числом, представляющим ключ на клавиатуре. Модуль pygame имеет предопределенные целочисленные константы, представляющие все общие ключи. Константы называются с капиталом K , подчеркиванием и именем ключа. Например, <- называется K_BACKSPACE , a называется K_a а F4 - K_F4 .

пример

Этот код проверяет, нажал ли пользователь w , a , s или d .

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Usually wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            print("Player moved up!")
        elif event.key == pygame.K_a:
            print("Player moved left!")
        elif event.key == pygame.K_s:
            print("Player moved down!")
        elif event.key == pygame.K_d:
            print("Player moved right!")

Модификаторы

Для заглавных букв нет целочисленной константы. Вместо этого ключевые события имеют еще один атрибут mod , который является модификатором ( shift , ctrl , alt и т. Д.) Одновременно нажатием клавиши. Атрибут mod - это целое число, представляющее нажатие модификатора. Каждое целое значение модификатора сохраняется в модуле pygame под именем KMOD_ и их именем. Например, сдвиг влево называется KMOD_LSHIFT , Tab имеет имя KMOD_TAB а Ctrl - KMOD_CTRL .

пример

Этот код проверяет, нажал ли пользователь a , сдвиг влево + a или Caps + a .

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # It's still wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_a:
            if event.mod == 0:  # No modifier.
                print("You pressed 'a'")
            elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
                print("You pressed 'A'")
            else:
                print("You pressed 'a' with another modifier than right shift or caps.")

События мыши

Существует три типа событий мыши в pygame MOUSEMOTION , MOUSEBUTTONDOWN и MOUSEBUTTONUP . Pygame зарегистрирует эти события, когда установлен режим отображения.

MOUSEMOTION принимается, когда пользователь перемещает свою или ее мышь на дисплей. Он имеет buttons атрибутов, pos и rel .

  • buttons представляют собой кортеж, представляющий нажатие кнопок мыши ( left , mouse-wheel , right ) или нет.
  • pos - абсолютное положение ( x , y ) курсора в пикселях.
  • rel - позиция относительно предыдущей позиции ( rel_x , rel_y ) в пикселях.

MOUSEBUTTONDOWN и MOUSEBUTTONUP принимаются, когда пользователь нажимает или отпускает кнопку мыши. У них есть button атрибутов и pos .

  • button представляет собой целое число, представляющее нажатую кнопку. 1 для левой кнопки, 2 для колесика мыши и 3 для правой кнопки.
  • pos - это абсолютное положение мыши ( x , y ), когда пользователь нажал кнопку мыши.

пример

Вот краткий пример использования некоторых атрибутов каждого события мыши:

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Close your program if the user wants to quit.
        raise SystemExit
    elif event.type == pygame.MOUSEMOTION:
        if event.rel[0] > 0:  # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
            print("You're moving the mouse to the right")
        elif event.rel[1] > 0:  # pygame start y=0 at the top of the display, so higher y-values are further down.
            print("You're moving the mouse down")
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:
            print("You pressed the left mouse button")
        elif event.button == 3:
            print("You pressed the right mouse button")
    elif event.type == pygame.MOUSEBUTTONUP:
        print("You released the mouse button")

Поскольку в модуле pygame нет предопределенных констант для атрибута кнопки мыши, вот значения для каждого:

кнопка Значение
Левую кнопку мыши 1
Кнопка мыши 2
Правая кнопка мыши 3
Колесо мыши прокручивается вверх 4
Колесо мыши прокручивается вниз 5

При прокрутке кнопки мыши будут генерироваться pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP .

Проверка состояния

Вы можете вызвать функции из модуля pygame.key и pygame.mouse для получения состояния клавиши и мыши. Тем не менее, это не рекомендуемый способ обработки событий в pygame, поскольку есть некоторые недостатки:

  • Вы получите состояния при вызове функции, что означает, что вы можете пропустить события между вызовами, если пользователь быстро нажимает кнопки.

  • Вы не можете определить порядок событий.

  • Вам все равно нужно вызвать одну из функций события pygame для pygame, чтобы внутренне взаимодействовать с операционной системой, иначе он предупредит, что программа перестала отвечать на запросы. Функции, которые вы можете вызвать:

    • pygame.event.get() чтобы получить все события или типы событий (путем передачи типов в качестве аргумента) из очереди.
    • pygame.event.poll() чтобы получить одно событие из очереди.
    • pygame.event.wait() чтобы ждать одного события из очереди.
    • pygame.event.clear() чтобы очистить все события в очереди.
    • pygame.event.pump() чтобы позволить pygame обрабатывать внутренние действия (называется неявно указанными выше функциями).

События на клавиатуре

Ключевой модуль имеет функцию pygame.key.get_pressed() которая возвращает список состояний всех ключей. Список содержит 0 для всех клавиш, которые не нажаты, и 1 для всех нажатых клавиш. Его индекс в списке определяется константами в модуле pygame, все с префиксом K_ и именем ключа.

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
    print("You pressed 'a'")
if key[pygame.K_F1]:
    print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
    print("You pressed 'left shift'")
if key[pygame.K_q]:  # Press 'q' to exit the program
    quit()

Если вы хотите проверить одно нажатие клавиши, а не удерживать клавишу, вы можете сохранить предыдущее состояние всех ключей во временной переменной и проверить, изменяется ли значение:

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
    print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
    print("You pressed 'p'")
previous_key = key

Оператор оценивает значение true только тогда, когда текущая клавиша нажата, а предыдущая клавиша не нажата. Чтобы проверить, освободил ли пользователь ключ, вам нужно переключить ключевое слово not ( if not key[pygame.K_q] and previous_key[pygame.K_q] ). Для правильной работы вам необходимо установить переменную previous_key = pygame.key.get_pressed() перед игровым циклом, иначе вы получите NameError .

События мыши

Модуль мыши имеет функции, которые позволяют нам проверять и устанавливать положение мыши, а также проверять нажатые кнопки. Функция pygame.mouse.get_pressed() возвращает кортеж кортежа, представляющий, если pygame.mouse.get_pressed() кнопки мыши (левое, колесико мыши, справа) или нет.

pygame.event.pump()  # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
    pygame.mouse.set_pos(10, mouse_pos[1])  # Reset the mouse's x-position to 10.
    print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
    print("I'm right, right?")
if mouse_buttons[0]:  # Press left mouse button to exit.
    print("Program left")
    quit()


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow