Библиотека pygame №2

Назад в начало

Обработка нажатий клавиш клавиатуры

Создадим базовый шаблон для нашей игры (запомните его наизусть)

import pygame
from sys import exit

pygame.init()

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
PURPLE = (156, 39, 176)
INDIGO = (63, 81, 181)
BLUE = (33, 150, 243)
GREEN = (76, 175, 80)
YELLOW = (255, 235, 59)
ORANGE = (255, 152, 0)
GREY = (158, 158, 158)

display = pygame.display.set_mode( (800, 600) )

FPS = 60
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    pygame.display.update()

    clock.tick(FPS)

pygame отслеживает все происходящие в игре события и позволяет нам их обрабатывать. При возникновении события создается экземпляр класса Event. Каждый экземпляр этого класса имеет определенный список свойств. Одно из этих свойств - это свойство type. Именно оно позволяет нам понять, какое событие произошло.

События клавиатуры имеют тип KEYDOWN.

Еще одно важное свойство - это свойство key. Для нас оно представляет интерес, когда мы обнаружили событие с типом KEYDOWN. С помощью свойства key мы можем узнать, какая клавиша была нажата.

import pygame
from sys import exit

pygame.init()

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
PURPLE = (156, 39, 176)
INDIGO = (63, 81, 181)
BLUE = (33, 150, 243)
GREEN = (76, 175, 80)
YELLOW = (255, 235, 59)
ORANGE = (255, 152, 0)
GREY = (158, 158, 158)

display = pygame.display.set_mode( (800, 600) )

FPS = 60
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print('Левая стрелка')
            elif event.key == pygame.K_RIGHT:
                print('Правая стрелка')
            elif event.key ==pygame.K_UP:
                print('Стрелка вверх')
            elif event.key ==pygame.K_DOWN:
                print('Стрелка вниз')

    pygame.display.update()

    clock.tick(FPS)

После запуска скрипта при нажатии стрелок на клавиатуре в стандартный вывод будут выводится строки с информацией о нажатой клавише.

Напишем код, который будет рисовать кружок

pygame.draw.circle(display, BLUE, (400, 300), 5)
# Добавьте этот скрипт после цикла while

Заставим кружок двигаться. Нужно объявить две переменные - x и y. Эти переменные будут координатами нашего кружка. При нажатии клавиши мы будем изменять эти переменные. Если нажата стрелка вправо, увеличим переменную x на 10. Если - стрелка влево, уменьшим переменную x на 10. Проделаем то же самое с переменной y.

import pygame
from sys import exit

pygame.init()

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
PURPLE = (156, 39, 176)
INDIGO = (63, 81, 181)
BLUE = (33, 150, 243)
GREEN = (76, 175, 80)
YELLOW = (255, 235, 59)
ORANGE = (255, 152, 0)
GREY = (158, 158, 158)

display = pygame.display.set_mode( (800, 600) )

FPS = 60
clock = pygame.time.Clock()

x = 400 # начальная координата по оси X
y = 300 # начальная координата по оси Y

while True:
    # Рисуем кружок в точке с координатами x,y
    pygame.draw.circle(display, BLUE, (x, y), 5)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print('Левая стрелка')
                x -= 10
            elif event.key == pygame.K_RIGHT:
                print('Правая стрелка')
                x += 10
            elif event.key == pygame.K_UP:
                print('Стрелка вверх')
                y -= 10
            elif event.key == pygame.K_DOWN:
                print('Стрелка вниз')
                y += 10

    pygame.display.update()

    clock.tick(FPS)

Есть один нюанс. Шарик перемещается только один раз при зажатии одной из клавиш. Немного изменим наш код для того, чтобы он обратывал зажатые клавиш.

# ... Код выше без изменений
while True:
    pygame.draw.circle(display, BLUE, (x, y), 5)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    # Найдите 10 отличий
    # Удаляем elif с KEYDOWN
    keys = pygame.key.get_pressed() # Словарь всех нажатых клавиш
    # Обрабатываем каждую клавишу по отдельности
    if keys[pygame.K_LEFT]:
        x -= 10
    if keys[pygame.K_RIGHT]:
        x += 10
    if keys[pygame.K_UP]:
        y -= 10
    if keys[pygame.K_DOWN]:
        y += 10
    pygame.display.update()

    clock.tick(FPS)

События мыши

В pygame обрабатываются три типа событий мыши: нажатие кнопки (значение свойства type события соответствует MOUSEBUTTONDOWN), отпускание кнопки (MOUSEBUTTONUP), перемещение мыши (MOUSEMOTION). Какая именно кнопка была нажата, записывается в другое свойство события - button. Для левой кнопки это число 1, для средней - 2, для правой - 3, для прокручивания вперед - 4, для прокручивания назад - 5.

Другим атрибутом мышиных типов событий является свойство pos, в которое записываются координаты нажатия (кортеж из двух чисел).

При нажатии левой кнопки мыши будем рисовать оранжевый кружок

# Код выше без изменений...
while True:
    display.fill(BLACK)
    pygame.draw.circle(display, BLUE, (x, y), 5)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
         elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30)
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        print('Левая стрелка')
        x -= 10
    if keys[pygame.K_RIGHT]:
        print('Правая стрелка')
        x += 10
    if keys[pygame.K_UP]:
        print('Стрелка вверх')
        y -= 10
    if keys[pygame.K_DOWN]:
        print('Стрелка вниз')
        y += 10


    pygame.display.update()

    clock.tick(FPS)

Добавим появление белых кружков по нажатию правой кнопки мыши.

# Код выше без изменений...
while True:
    display.fill(BLACK)
    pygame.draw.circle(display, BLUE, (x, y), 5)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
         elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30)
            elif event.button == 3:
                pygame.draw.circle(display, WHITE, (event.pos[0], event.pos[1]), 30)
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        print('Левая стрелка')
        x -= 10
    if keys[pygame.K_RIGHT]:
        print('Правая стрелка')
        x += 10
    if keys[pygame.K_UP]:
        print('Стрелка вверх')
        y -= 10
    if keys[pygame.K_DOWN]:
        print('Стрелка вниз')
        y += 10


    pygame.display.update()

    clock.tick(FPS)

Добавим очищение поверхности при скролле колесика мыши

# Код выше без изменений...
while True:
    display.fill(BLACK)
    pygame.draw.circle(display, BLUE, (x, y), 5)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
         elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30)
            elif event.button == 3:
                pygame.draw.circle(display, WHITE, (event.pos[0], event.pos[1]), 30)
            elif event.button == 5:
                display.fill(BLACK)
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        print('Левая стрелка')
        x -= 10
    if keys[pygame.K_RIGHT]:
        print('Правая стрелка')
        x += 10
    if keys[pygame.K_UP]:
        print('Стрелка вверх')
        y -= 10
    if keys[pygame.K_DOWN]:
        print('Стрелка вниз')
        y += 10


    pygame.display.update()

    clock.tick(FPS)

Задание:

Создайте еще один перемещающийся объект, назначьте клавиши WASD для его перемещения. Ключи клавиш: W == K_w, A == K_a, D == K_d, S == K_s. Обратите внимание, что вам понадобятся новые переменные для координат, например, x1 и y1.