В ходе разработки функция check_events() будет становиться все длиннее, поэтому мы выделим из check_events() еще две функции: для обработки событий KEYDOWN и для обработки событий KEYUP:

game_functions.py

def check_keydown_events(event, ship):

. ."""Реагирует на нажатие клавиш."""

if event.key == pygame.K_RIGHT:

ship.moving_right = True

elif event.key == pygame.K_LEFT:

ship.moving_left = True

def check_keyup_events(event, ship):

. ."""Реагирует на отпускание клавиш."""

if event.key == pygame.K_RIGHT:

ship.moving_right = False

elif event.key == pygame.K_LEFT:

ship.moving_left = False

def check_events(ship):

"""Обрабатывает нажатия клавиш и события мыши."""

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

elif event.type == pygame.KEYDOWN:

. . . . . .check_keydown_events(event, ship)

elif event.type == pygame.KEYUP:

. . . . . .check_keyup_events(event, ship)

В программе появились две новые функции: check_keydown_events() и check_keyup_events(). Каждая функция получает параметр event и параметр ship. Тела двух функций скопированы из check_events(), а старый код заменен вызовами новых функций. Новая структура кода упрощает функцию check_events() и облегчает последующее программирование реакции на действия игрока.

<p>В двух словах</p>

В следующем разделе мы реализуем стрельбу, для чего нам потребуется новый файл с именем bullet.py и изменения в некоторых уже имеющихся файлах. В настоящее время программа состоит из четырех файлов с разными классами, функциями и методами. Чтобы вы четко представляли себе структуру проекта, кратко проанализируем каждый из этих файлов перед добавлением новой функциональности.

<p>alien_invasion.py</p>

Главный файл программы alien_invasion.py создает ряд важных объектов, используемых ходе игры: настройки хранятся в ai_settings, основная поверхность для вывода изображения хранится в screen, а экземпляр ship тоже создается в этом файле. Также в alien_invasion.py содержится главный цикл игры — цикл while с вызовами check_events(), ship.update() и update_screen().

Файл alien_invasion.py — единственный файл, который должен запускаться для игры в Alien Invasion. Все остальные файлы — settings.py, game_functions.py, ship.py — содержат код, который импортируется (прямо или косвенно) в этот файл.

<p>settings.py</p>

Файл settings.py содержит класс Settings. Этот класс содержит только метод __init__(), инициализирующий атрибуты, которые управляют внешним видом и скоростью игры.

<p>game_functions.py</p>

Файл game_functions.py содержит набор функций, выполняющих основную работу в игре. Функция check_events() обнаруживает события, представляющие интерес для игры (например, нажатия и отпускания клавиш), и обрабатывает все эти типы событий при помощи вспомогательных функций check_keydown_events() и check_keyup_events(). Пока эти функции управляют только движением корабля. Модуль game_functions также содержит функцию update_screen(), которая перерисовывает экран при каждом проходе основного цикла.

<p>ship.py</p>

Файл ship.py содержит класс Ship. В этом классе определен метод __init__(), метод update() для управления позицией корабля и метод blitme() для вывода изображения корабля на экран. Изображение корабля хранится в файле ship.bmp, который находится в папке images.

Упражнения

12-3. Ракета: создайте игру, у которой в исходном состоянии в центре экрана находится ракета. Игрок может перемещать ракету вверх, вниз, вправо и влево четырьмя клавишами со стрелками. Проследите за тем, чтобы ракета не выходила за края экрана.

12-4. Клавиши: создайте файл Pygame, который создает пустой экран. В ­цикле событий выводите значение атрибута event.key при обнаружении события pygame.KEYDOWN. Запустите программу, нажимайте различные клавиши и понаблюдайте за реакцией Pygame.

<p>Стрельба</p>

А теперь добавим в игру возможность стрельбы. Мы напишем код, который выпускает пулю (маленький прямоугольник) при нажатии игроком клавиши «пробел». Пули летят вертикально вверх, пока не исчезнут у верхнего края экрана.

<p>Добавление настроек</p>

Сначала добавим в settings.py новые настройки для значений, управляющих поведением класса Bullet. Эти настройки добавляются в конец метода __init__():

settings.py

. . def __init__(self):

. . . ....

. . . .# Параметры пули

. . . .self.bullet_speed_factor = 1

. . . .self.bullet_width = 3

. . . .self.bullet_height = 15

. . . .self.bullet_color = 60, 60, 60

Эти настройки создают темно-серые пули с шириной 3 пиксела и высотой 15 пикселов. Пули двигаются немного медленнее, чем корабль.

<p>Создание класса Bullet</p>

Теперь создадим файл bullet.py для хранения класса Bullet. Первая часть файла bullet.py выглядит так:

bullet.py

import pygame

from pygame.sprite import Sprite

class Bullet(Sprite):

. ."""Класс для управления пулями, выпущенными кораблем."""

. .def __init__(self, ai_settings, screen, ship):

. . . ."""Создает объект пули в текущей позиции корабля."""

. . . .super(Bullet, self).__init__()

. . . .self.screen = screen

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги