Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python

Создание игр на Python 3 и Pygame: Часть 3

by
Difficulty:IntermediateLength:ShortLanguages:
This post is part of a series called Building Games with Python 3 and PyGame.
Building Games With Python 3 and Pygame: Part 2
Building Games With Python 3 and Pygame: Part 4

Russian (Pусский) translation by Marat Amerov (you can also view the original English article)

Обзор

Это третья из пяти частей туториала о создании игр с помощью Python 3 и Pygame. Во второй части мы рассмотрели класс TextObject, используемый для рендеринга текста на экран, создали основное окно и узнали, как отрисовывать объекты: кирпичи, мяч и ракетку.

В этой части мы погрузимся глубже в сердце Breakout и узнаем, как обрабатывать события, познакомимся с основным классом Breakout и увидим, как перемещать различные объекты в игре.

Обработка событий

В Breakout есть три типа событий: события нажатий клавиш, события мыши и события таймера. Основной цикл в классе Game обрабатывает нажатия клавиш и события мыши и передаёт их подписчикам (вызывая функцию-обработчик).

Хотя класс Game очень общий и не обладает знаниями о реализации Breakout, сама подписка и способы обработки событий очень специфичны.

Класс Breakout

В классе Breakout реализуется большинство знаний о том, как управляется игра Breakout. В этой серии туториалов мы несколько раз встретимся с классом Breakout. Вот строки, которые регистрируют различные обработчики событий.

Нужно учесть, что все события клавиш (и для левой, и для правой «стрелки») передаются одному методу-обработчику ракетки.

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

Класс Game вызывает зарегистрированные обработчики для каждого события клавиш и передаёт клавишу. Заметьте, что это не класс Paddle. В Breakout единственный объект, который интересуют подобные события — это ракетка. При нажатии или отпускании клавиши вызывается его метод handle().

Объекту Paddle не нужно знать, было ли это событие нажатия или отпускания клавиши, потому что он управляет текущим состоянием с помощью пары булевых переменных: moving_left и moving_right. Если moving_left равна True, то значит, была нажата клавиша «влево», и следующим событием будет отжатие клавиши, которое сбросит переменную. То же самое относится и к клавише «вправо». Логика проста и заключается в переключении состояния этих переменных в ответ на любое событие.

Обработка событий мыши

В Breakout есть игровое меню, с которым мы скоро встретимся. Кнопка меню управляет различными событиями мыши, такими как движение и нажатия кнопок (события mouse down и mouse up). В ответ на эти события кнопка обновляет переменную внутреннего состояния. Вот код обработки мыши:

Заметьте, что метод handle_mouse_event(), зарегистрированный для получения событий мыши, проверяет тип события и переадресует его к соответствующему методу, обрабатывающему этот тип события.

Обработка событий таймера

События таймера не обрабатываются в основном цикле. Однако поскольку основной цикл вызывается в каждом кадре, легко проверить, настало ли время определённого события. Вы увидите это позже, когда мы будем обсуждать временные спецэффекты.

Ещё одной ситуацией является необходимость приостановки игры. Например, при отображении сообщения, которое игрок должен прочитать и чтобы при этом ничего его не отвлекало. Метод show_message() класса Breakout использует такой подход и вызывает time.sleep(). Вот соответствующий код:

Игровой процесс

Игровой процесс (геймплей) — это то место, в котором вступают в дело правила Breakout. Геймплей заключается в перемещении различных объектов в ответ на события и в изменении состояния игры на основании их взаимодействий.

Перемещение ракетки

Вы видели ранее, что класс Paddle реагирует на нажатия клавиш со стрелками, обновляя свои поля moving_left и moving_right. Само движение происходит в методе update(). Здесь выполняются определённые вычисления, если ракетка находится близко к левой или правой границе экрана. Мы не хотим, чтобы ракетка выходила за границы экрана (с учётом заданного смещения).

Поэтому если движение перемещает объект за границы, то код регулирует движение так, чтобы оно останавливалось прямо у границы. Так как ракетка движется только горизонтально, вертикальный компонент перемещения всегда равен нулю.

Перемещение мяча

Мяч просто использует функционал базового класса GameObject, который перемещает объекты на основании их скорости (её горизонтального и вертикального компонентов). Как мы вскоре увидим, скорость мяча определяется множеством факторов в классе Breakout. Так как движение заключается просто в прибавлении скорости к текущему положению, то направление, в котором движется мяч, полностью определяется скоростью вдоль горизонтальной и вертикальной осей.

Задание исходной скорости мяча

Мяч в Breakout возникает из ниоткуда в самом начале игры каждый раз, когда игрок теряет жизнь. Он просто материализуется из эфира и начинает падать или ровно вниз, или под небольшим углом. Когда мяч создаётся в методе create_ball(), он получает скорость со случайным горизонтальным компонентом в промежутке от -2 до 2 и вертикальным компонентом, задаваемым в модуле config.py (по умолчанию задано значение 3).

Подведём итог

В этой части мы рассмотрели обработку таких событий, как нажатие клавиш, движение мыши и нажатие кнопок мыши. Также мы изучили некоторые элементы геймплея Breakout: перемещение ракетки, движение мяча и управление скоростью мяча.

Помните также, что у нас есть для продажи и для изучения в Envato Market, если вы хотите изучить больше материала, связанного с Python.

В четвёртой части мы рассмотрим важную тему распознавания коллизий и увидим, что происходит, когда мяч ударяется об разные игровые объекты: ракетку, кирпичи, стены, потолок и пол.

Затем мы уделим внимание игровому меню. Мы создадим собственные кнопки, которые используем в качестве меню и сможем при необходимости показывать и скрывать.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.