Работа с событиями
Нажатие на крестик
Есть в любой программе на pygame. Все просто.
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
Дальше предполагается, что мы уже проходимся по собятиям в цикле for event in pygame.event.get:
Нажатие на кнопки
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
vel_y = vel_y - 10
if event.key == pygame.K_DOWN:
vel_y = vel_y + 10
На что стоит обратить внимание.
Это проверка именно на cобытие нажатия а не "держания" клавиши, то есть сколько бы вы не держали нажатой клавишу, скорость изменится только 1 раз. Чтобы реагировать на постоянно зажатую кнопку, нужно делать немного иначе.
pygame.KEYDOWN
- это тип события (нажатие на кнопку)pygame.K_DOWN
,pygame.K_UP
- "ключи" события (event.key
)
Коды кнопок
Полный список здесь. Те которые вам могут пригодиться:
K_UP
,K_DOWN
,K_RIGHT
,K_LEFT
- стрелкиK_SPACE
- пробелK_w
,K_a
,K_s
,K_d
- кнопкиw
a
s
d
Клик мышкой
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # левая кнопка мыши
bird_pos = event.pos
if event.button == 3: # правая кнопка мыши
bird_image = new_image
Определить какая кнопка была нажата на мышке можно используя значение
event.button
:1
- left click2
- middle click3
- right click4
- scroll up5
- scroll downКоординаты нажатия находятся в
event.pos
.
Движение мышки
Не только нажатие, но и движение мышки тоже является событием. Действительно, что если нам нужно чтобы какой нибудь объект постоянно следил за курсором? Нужно запускать его движение тогда когда мышка движется.
Координаты хранятся также как и в предыдущем случае - в переменной event.pos
.
if event.type == pygame.MOUSEMOTION:
cursor_pos = event.pos
Как проверить зажата ли клавиша?
Часто бывает, что хочется реагировать не на одиночное событие нажатия клавиши, а проверять зажата ли она. Для этого можно в каждом кадре написать например такое условие
if pygame.key.get_pressed()[pygame.K_RIGHT]:
x = x + 1
Работает это так: функция
pygame.key.get_pressed()
возвращает словарь вида
{
pygame.K_UP: True,
pygame.K_DOWN: False,
pygame.K_RIGHT: True,
pygame.K_LEFT: False,
...
}