Работа с событиями
Нажатие на крестик
Есть в любой программе на 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- кнопкиwasd
Клик мышкой
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,
...
}