Создадим базовый шаблон для нашей игры (запомните его наизусть)
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.