Продолжим создание игры на Python с использованием библиотеки Pygame. В прошлом уроке мы установили Pygame, инициализировали игру, создали окно и отрисовали лазерную пушку.
Размер окна
Изменим ширину окна на 700 пикселей.
Управление пушкой
Научим пушку двигаться по горизонтали при нажатии клавиш. Каждое действие пользователя (нажатие или отпускание клавиши) является событием. Нам нужно перехватывать эти события и реагировать на них.
Для улучшения структуры кода, обработку событий вынесем в отдельный файл controls.py.
Файл controls.py
Функция handle_events() обрабатывает события нажатия клавиш:
import pygame
def handle_events(gun, events):
"""Обработка событий нажатия на клавиши."""
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_d: # Клавиша "D" – движение вправо
gun.m_right = True
elif event.key == pygame.K_a: # Клавиша "A" – движение влево
gun.m_left = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_d:
gun.m_right = False
elif event.key == pygame.K_a:
gun.m_left = False
Используем pygame.KEYDOWN для отслеживания нажатия клавиш и pygame.KEYUP для отпускания. Булевы переменные m_right и m_left отслеживают состояние нажатых клавиш.
Обновление позиции пушки
Добавим функцию update() в класс пушки:
def update(self):
if self.m_right:
if self.rect.right < self.screen_rect.right:
self.rect.x += 1
if self.m_left:
if self.rect.left > 0:
self.rect.x -= 1
Функция проверяет состояние булевых переменных и передвигает пушку вправо или влево, если соответствующая клавиша нажата, не позволяя пушке выходить за пределы экрана.
Подключение controls.py
Импортируем модуль controls и вызываем функцию handle_events() в основном цикле:
import pygame
import controls
# ... остальной код ...
while True:
# ... остальной код ...
controls.handle_events(gun, pygame.event.get())
gun.update()
# ... остальной код ...
Мы научились обрабатывать события нажатия клавиш, улучшили структуру кода, добавив отдельный файл для обработки событий, и реализовали горизонтальное движение пушки с ограничением по границам экрана.