Руководство по PyGame - Как создать игру с прыгающим мячиком
В этом туториале вы узнаете, как создать простую, но забавную игру с прыгающим мячом, используя библиотеку PyGame.
Если вы новичок, желающий постичь основы разработки игр, или энтузиаст, стремящийся изучить возможности PyGame, эта статья станет вашим руководством по созданию простой, но увлекательной игры.
Вам просто нужно разбить шаги, прочитать код и наслаждаться процессом!
В конце этого руководства ваша игра должна выглядеть следующим образом:
Как настроить среду разработки?
Инструменты и программы
Прежде чем приступить к кодированию, давайте поговорим об инструментах, которые будут подпитывать ваше творчество.
Python
Вы будете использовать Python, универсальный и удобный для начинающих язык программирования. Его чистый синтаксис и широкая поддержка библиотек делают его отличным выбором для разработки игр.
Если у вас не установлен Python, зайдите на сайт python.org, чтобы скачать и установить последнюю версию.
PyGame
Ваше секретное оружие для этого проекта. PyGame, набор модулей Python, упрощает разработку игр за счет обработки мультимедийных элементов, таких как изображения и звуки. Это движок, на котором будет работать ваша игра.
Чтобы установить PyGame, вы можете использовать следующую команду в терминале или командной строке:
pip install pygame
Текстовый редактор
Будь то VSCode, PyCharm или Thonny, эти среды предлагают такие возможности, как подсветка синтаксиса и инструменты отладки. Выберите ту, с которой вам удобнее всего работать, и приступайте к написанию кода!
Я буду использовать VSCode, но не стесняйтесь использовать то, что вам нравится. Если вы чувствуете себя авантюристом, можете попробовать Thonny!
Теперь, когда вы вооружены нужными инструментами, давайте приступим к написанию кода и воплотим вашу идею в жизнь.
Определение концепции игры
Концепция и механика игры
Давайте разберем основные концепции и механики, которые вам предстоит реализовать.
Управление платформой:
- Цель игры: Используйте клавиши со стрелками, чтобы перемещать платформу влево или вправо.
- Реализация: Ваша платформа перемещается по горизонтали, основываясь на нажатии клавиш.
- Ограничения: Пусть платформа не выходит за границы экрана.
Динамика прыгающего мячика:
- Цель игры: Перемещение прыгающего мячика по экрану.
- Реализация: Мяч движется самостоятельно, отскакивая от стен и платформы.
- Взаимодействие: Каждый раз, когда мяч успешно отскакивает от платформы, начисляются очки.
Система подсчета очков:
- Цель: Накопление очков за удачные отскоки.
- Реализация: Ваш код определяет систему подсчета очков.
- Задача: Оптимизация механизма подсчета очков для получения более высоких результатов.
Повышение уровня:
- Цель: Продвижение по уровням по мере того, как счет будет достигать определенных значений.
- Реализация: С каждыми 10 очками происходит переход на новый уровень.
- Задача: С каждым уровнем сложность игры возрастает.
Цвет динамической платформы:
- Цель: Цвет платформы меняется с каждым уровнем, добавляя визуальную динамику.
- Реализация: Цвета генерируются случайным образом при достижении нового уровня.
- Эстетическое восприятие: Добавляет разнообразие и азарт в игровой процесс.
Жизни и окончание игры:
- Цель игры: Для сохранения жизней нужно не допустить падения мяча за пределы экрана.
- Реализация: Жизни уменьшаются при пропущенных ударах. Игра заканчивается, когда все жизни кончаются (всего есть 3 жизни).
- Перезапуск: После завершения игры можно перезапустить игру с тремя жизнями и новым счетом.
Как закодировать игру?
Инициализация приложения
В этом разделе вы определите такие константы, как размеры экрана, свойства шара и платформы, а также цвета.
Вы также инициализируете PyGame, настроите экран и создадите объект clock
для управления частотой кадров.
Затем вы инициализируете переменные для игры, включая положение мяча, его скорость, положение платформы, её скорость, счёт, жизни и текущий уровень.
Вот код для создания всего этого:
import pygame
import sys
import random
# Constants
WIDTH, HEIGHT = 800, 600
BALL_RADIUS = 20
PLATFORM_WIDTH, PLATFORM_HEIGHT = 100, 10
FPS = 60
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)
LIGHT_BLUE = (173, 216, 230) # Light blue color for the level indicator
Давайте разберем код шаг за шагом:
Импортирование библиотек:
import pygame
: Импортирует библиотеку Pygame, которая используется для разработки игр на Python.import sys
: Импортирует модуль sys, предоставляя доступ к некоторым переменным, используемым или поддерживаемым интерпретатором, и функциям, взаимодействующим с интерпретатором.
Константы:
WIDTH, HEIGHT = 800, 600
: Определяет размеры игрового окна.BALL_RADIUS = 20
: Задаёт радиус прыгающего мячика.PLATFORM_WIDTH, PLATFORM_HEIGHT = 100, 10
: Устанавливает размеры платформы.FPS = 60
: Определяет количество кадров в секунду, контролируя скорость игры.- Различные цветовые константы, такие как
BLACK
,WHITE
,RED
,YELLOW
,ORANGE
иLIGHT_BLUE
, представляют собой значения RGB для цветов, используемых в игре.
Как создать экземпляр PyGame?
Теперь вам предстоит создать окно PyGame и определить несколько глобальных переменных, которые вы будете использовать для каждого уровня игры:
# Initialize Pygame
pygame.init()
# Create the screen
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Bouncing Ball Game")
font = pygame.font.Font(None, 36)
# Clock to control the frame rate
clock = pygame.time.Clock()
# Initialize variables for the game
ball_pos = [WIDTH // 2, HEIGHT // 2]
ball_speed = [random.uniform(2, 4), random.uniform(2, 4)] # Faster starting speed
platform_pos = [WIDTH // 2 - PLATFORM_WIDTH // 2, HEIGHT - PLATFORM_HEIGHT - 10]
platform_speed = 10
score = 0
lives = 3
current_level = 1
platform_color = ORANGE # Initialize platform color
Инициализация Pygame
pygame.init()
: Инициализирует библиотеку Pygame.
Создание игрового окна
screen = pygame.display.set_mode((WIDTH, HEIGHT))
: Создаёт игровое окно с заданными размерами.pygame.display.set_caption("Bouncing Ball Game")
: Устанавливает заголовок игрового окна.font = pygame.font.Font(None, 36)
: Инициализирует шрифт для отрисовки текста.
Часы для управления частотой кадров
clock = pygame.time.Clock()
: Создает объект часов для управления частотой кадров.
Инициализация игровых переменных
ball_pos = [WIDTH // 2, HEIGHT // 2]
: Инициализирует начальную позицию шара в центре экрана.ball_speed = [random.uniform(2, 4), random.uniform(2, 4)]
: Инициализирует начальную скорость мяча со случайными значениями.platform_pos = [WIDTH // 2 - PLATFORM_WIDTH // 2, HEIGHT - PLATFORM_HEIGHT - 10]
: Инициализирует начальную позицию платформы.platform_speed = 10
: Устанавливает скорость перемещения платформы.score = 0
: Определяет счёт игрока.lives = 3
: Определяет количество жизней игрока.current_level = 1
: Определяет текущий уровень игры.platform_color = ORANGE
: Определяет цвет платформы.
Как создавать игровые экраны?
Необходимо создать как минимум три экрана: один для начала игры, один для победы в игре и один для проигрыша в игре. Для этого можно использовать следующий код:
# Functions for screens
def start_screen():
screen.fill(BLACK)
show_text_on_screen("Bouncing Ball Game", 50, HEIGHT // 4)
show_text_on_screen("Press any key to start...", 30, HEIGHT // 3)
show_text_on_screen("Move the platform with arrow keys...", 30, HEIGHT // 2)
pygame.display.flip()
wait_for_key()
def game_over_screen():
screen.fill(BLACK)
show_text_on_screen("Game Over", 50, HEIGHT // 3)
show_text_on_screen(f"Your final score: {score}", 30, HEIGHT // 2)
show_text_on_screen("Press any key to restart...", 20, HEIGHT * 2 // 3)
pygame.display.flip()
wait_for_key()
def victory_screen():
screen.fill(BLACK)
show_text_on_screen("Congratulations!", 50, HEIGHT // 3)
show_text_on_screen(f"You've won with a score of {score}", 30, HEIGHT // 2)
show_text_on_screen("Press any key to exit...", 20, HEIGHT * 2 // 3)
pygame.display.flip()
wait_for_key()
def wait_for_key():
waiting = True
while waiting:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
waiting = False
def show_text_on_screen(text, font_size, y_position):
font = pygame.font.Font(None, font_size)
text_render = font.render(text, True, WHITE)
text_rect = text_render.get_rect(center=(WIDTH // 2, y_position))
screen.blit(text_render, text_rect)
def change_platform_color():
return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
Давайте рассмотрим все функции:
Функция start_screen()
:
- Очищает экран с помощью черного фона, используя
screen.fill(BLACK)
. - Отображает название игры и инструкции с помощью
show_text_on_screen
. - Поворачивает дисплей, чтобы сделать изменения видимыми с помощью
pygame.display.flip()
. - Вызывает
wait_for_key()
, чтобы ожидать нажатия клавиши, прежде чем продолжить.
Функция game_over_screen()
:
- Очищает экран с помощью черного фона.
- Отображает сообщение об окончании игры, финальный счёт и инструкции по перезапуску.
- Переворачивает дисплей.
- Вызывает
wait_for_key()
, чтобы ожидать нажатия клавиши.
Функция victory_screen()
:
- Очищает экран с помощью черного фона.
- Отображает поздравительное сообщение, итоговый счёт и инструкции по выходу из игры.
- Переворачивает дисплей.
- Вызывает
wait_for_key()
, чтобы ожидать нажатия клавиши.
Функция wait_for_key()
:
- Ожидает либо события выхода из игры (закрытия окна игры), либо события нажатия клавиши.
- Если событие - выход из игры, оно завершает игру с помощью
pygame.quit()
иsys.exit()
. - Если событие - это нажатие клавиши, оно выходит из цикла ожидания.
Функция show_text_on_screen(text, font_size, y_position)
:
- Выводит на экран текст с указанным размером шрифта и позицией по оси Y.
- Использует класс
pygame.font.Font
для создания объекта шрифта. - Переводит текст на поверхность с заданным цветом (в данном случае - белый).
- Помещает текст в центр экрана в указанной позиции Y.
- Наносит текст на игровой экран.
Функция change_platform_color()
:
- Возвращает случайный цвет RGB для изменения цвета платформы.
Эти функции обрабатывают различные аспекты игровых экранов, взаимодействия с пользователем и отображения текста. Они вносят свой вклад в общую структуру и пользовательский опыт игры.
Основной игровой цикл
А теперь вам предстоит закодировать главный цикл игры с его прикладной механикой. Давайте сначала посмотрим код, а затем объяснение.
Это самый длинный блок кода в этом руководстве, так что наберитесь терпения - оно того стоит.
# Main game loop
start_screen()
game_running = True
while game_running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_running = False
keys = pygame.key.get_pressed()
# Move the platform
platform_pos[0] += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * platform_speed
platform_pos[1] += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * platform_speed
# Ensure the platform stays within the screen boundaries
platform_pos[0] = max(0, min(platform_pos[0], WIDTH - PLATFORM_WIDTH))
platform_pos[1] = max(0, min(platform_pos[1], HEIGHT - PLATFORM_HEIGHT))
# Move the ball
ball_pos[0] += ball_speed[0]
ball_pos[1] += ball_speed[1]
# Bounce off the walls
if ball_pos[0] <= 0 or ball_pos[0] >= WIDTH:
ball_speed[0] = -ball_speed[0]
if ball_pos[1] <= 0:
ball_speed[1] = -ball_speed[1]
# Check if the ball hits the platform
if (
platform_pos[0] <= ball_pos[0] <= platform_pos[0] + PLATFORM_WIDTH
and platform_pos[1] <= ball_pos[1] <= platform_pos[1] + PLATFORM_HEIGHT
):
ball_speed[1] = -ball_speed[1]
score += 1
# Check if the player advances to the next level
if score >= current_level * 10:
current_level += 1
ball_pos = [WIDTH // 2, HEIGHT // 2]
ball_speed = [random.uniform(2, 4), random.uniform(2, 4)] # Randomize the ball speed
platform_color = change_platform_color()
# Check if the ball falls off the screen
if ball_pos[1] >= HEIGHT:
# Decrease lives
lives -= 1
if lives == 0:
game_over_screen()
start_screen() # Restart the game after game over
score = 0
lives = 3
current_level = 1
else:
# Reset the ball position
ball_pos = [WIDTH // 2, HEIGHT // 2]
# Randomize the ball speed
ball_speed = [random.uniform(2, 4), random.uniform(2, 4)]
# Clear the screen
screen.fill(BLACK)
# Draw the ball
pygame.draw.circle(screen, WHITE, (int(ball_pos[0]), int(ball_pos[1])), BALL_RADIUS)
# Draw the platform
pygame.draw.rect(screen, platform_color, (int(platform_pos[0]), int(platform_pos[1]), PLATFORM_WIDTH, PLATFORM_HEIGHT))
# Display information
info_line_y = 10 # Adjust the vertical position as needed
info_spacing = 75 # Adjust the spacing as needed
# Draw the score in an orange rectangle at the top left
score_text = font.render(f"Score: {score}", True, WHITE)
score_rect = score_text.get_rect(topleft=(10, info_line_y))
pygame.draw.rect(screen, ORANGE, score_rect.inflate(10, 5))
screen.blit(score_text, score_rect)
# Draw the level indicator in a light-blue rectangle at the top left (next to the score)
level_text = font.render(f"Level: {current_level}", True, WHITE)
level_rect = level_text.get_rect(topleft=(score_rect.topright[0] + info_spacing, info_line_y))
pygame.draw.rect(screen, LIGHT_BLUE, level_rect.inflate(10, 5))
screen.blit(level_text, level_rect)
# Draw the lives in a red rectangle at the top left (next to the level)
lives_text = font.render(f"Lives: {lives}", True, WHITE)
lives_rect = lives_text.get_rect(topleft=(level_rect.topright[0] + info_spacing, info_line_y))
pygame.draw.rect(screen, RED, lives_rect.inflate(10, 5))
screen.blit(lives_text, lives_rect)
# Update the display
pygame.display.flip()
# Control the frame rate
clock.tick(FPS)
# Quit Pygame
pygame.quit()
Ладно, это было очень сложно, но вот что мы сделали в приведенном выше коде:
Инициализация и стартовый экран
- Вызывает
start_screen()
для отображения начального экрана с инструкциями. - Устанавливает значение
game_running
вTrue
, чтобы запустить главный цикл игры.
Основной игровой цикл
- Работает до тех пор, пока
game_running
не станетFalse
(например, когда пользователь закрывает окно игры).
Обработка событий
- Проверяет наличие событий с помощью
pygame.event.get()
. - Если обнаружено событие выхода из игры (закрытие окна игры), установите значение
game_running
вFalse
, чтобы выйти из цикла.
Движение платформы
- Считывает состояние клавиш со стрелками с помощью
pygame.key.get_pressed()
. - Регулирует положение платформы в зависимости от нажатия клавиш со стрелками.
- Следит за тем, чтобы платформа не выходила за границы экрана.
Движение и подпрыгивание мячика
- Обновляет положение мяча в зависимости от его скорости.
- Применяет отскакивание от стен, меняя скорость при достижении краев экрана.
Обнаружение столкновений
- Проверяет, попадает ли мяч на платформу, сравнивая позиции.
- Если происходит столкновение, вертикальная скорость мяча изменяется на противоположную, и игрок получает очко.
Продвижение по уровням
- Проверяет, набрал ли игрок достаточно очков для перехода на следующий уровень.
- Если да, то увеличивается уровень, сбрасывается положение шарика, рандомизируется его скорость и меняется цвет платформы.
Проверка на предмет окончания игры
- Отслеживает, не выпал ли мяч за пределы экрана.
- Уменьшает количество жизней, если мяч находится под экраном.
- Если жизни закончились, отображается экран завершения игры, игра перезапускается и сбрасывает счёт, жизни и уровень.
Рендеринг экрана
- Очищает экран с помощью черного фона.
- Рисует мячик и платформу на экране.
- Отображает информацию о счёте, уровне и жизнях в прямоугольниках определенных цветов.
Обновление дисплея и управление частотой кадров
- Обновляет дисплей для отображения изменений.
- Управляет частотой кадров с помощью
clock.tick(FPS)
.
Окончание игры
- Выходит из PyGame и завершает программу при выходе из главного цикла.
Заключение
В этом уроке вы разобрались в тонкостях нескольких ключевых функций, которые составляют основу вашей игры с прыгающим мячиком.
Давайте вспомним их роль:
В этом уроке вы ознакомились с функцией start_screen()
, которая очищает экран с помощью черного фона, выводит название игры и инструкции, переворачивает дисплей для наглядности и ожидает нажатия клавиши с помощью wait_for_key()
.
Функция game_over_screen()
очищает экран с помощью черного фона, выводит сообщение об окончании игры, финальный счет и инструкции по перезапуску, переворачивает дисплей и ожидает нажатия клавиши с помощью wait_for_key()
.
Функция victory_screen()
очищает экран с помощью черного фона, выводит поздравительное сообщение, финальный счет и инструкции по выходу, переворачивает дисплей и ожидает нажатия клавиши wait_for_key()
.
Функция wait_for_key()
ожидает либо события выхода из игры (закрытия окна игры), либо события нажатия клавиши. В случае выхода она завершает игру, а в случае нажатия клавиши выходит из цикла ожидания.
Функция show_text_on_screen(text, font_size, y_position)
выводит на экран текст с заданными атрибутами, использует класс pygame.font.Font
для создания объекта шрифта, а также позиционирует и рисует текст в центре экрана.
А функция change_platform_color()
возвращает случайный RGB-цвет для изменения цвета платформы.
После этих функций вы перешли к главному игровому циклу, сердцу нашей игры. Он управляет игровой механикой, включая обработку событий, перемещение платформы и мяча, обнаружение столкновений, прохождение уровней и завершение игры.
Вы видели, как этот цикл обеспечивает непрерывный игровой процесс, отзывчивое взаимодействие с пользователем и динамичное визуальное оформление.
Теперь, когда у вас есть понимание этих функций и главного цикла, вы можете экспериментировать, настраивать и расширять свою игру. Почувствуйте в себе силы отправиться в путешествие по разработке игр, изучить новые возможности и создать уникальный игровой опыт. Счастливого кодинга!