Практическое применение Pygame в игровых проектах Python

Раздел: Python -> Разработка игр

Введение в Pygame: создание игр на Python

Pygame - это набор модулей Python для разработки 2D-игр. Он предоставляет инструменты для работы с графикой, звуком, событиями и таймерами. Библиотека подходит как для обучения, так и для небольших проектов. В этой статье разбираются основные приёмы работы с Pygame, сопровождающиеся примерами кода.

Базовый игровой цикл

Любая игра на Pygame начинается с инициализации, создания окна и запуска главного цикла, который обрабатывает события, обновляет состояние и рисует кадры.

import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    screen.fill((0, 0, 0))
    pygame.display.flip()
    clock.tick(60)

Python с использованием библиотеки pygame (библиотека pygame в python)

Код создаёт окно размером 800×600, устанавливает чёрный фон и поддерживает 60 кадров в секунду. Цикл завершается при закрытии окна.

Типичные ошибки:

  • Забыть вызвать pygame.init() - модули не будут инициализированы.
  • Пропустить pygame.display.flip() - изображение не обновится.
  • Не указывать clock.tick() - игра будет потреблять много ресурсов процессора.

Как обработать нажатие клавиш?

Для реакции на клавиши используются события KEYDOWN и KEYUP, либо постоянная проверка состояния клавиш через pygame.key.get_pressed().

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE:
        print('Пробел нажат')

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    x -= 5

программы python игры (игры на python)

Проблемы:

  • Событие KEYDOWN срабатывает однократно, а get_pressed() даёт сигнал каждый кадр - важно выбирать нужный подход.
  • Необходимо импортировать константы клавиш (например, pygame.K_LEFT).

Как загрузить и отобразить изображение?

Изображение загружается функцией pygame.image.load(), а затем отрисовывается методом blit().

player_img = pygame.image.load('player.png')
player_rect = player_img.get_rect()
player_rect.center = (400, 300)
screen.blit(player_img, player_rect)

Pygame python создание игры (создание игры на pygame)

Типичные ошибки:

  • Файл не найден - проверьте относительный или абсолютный путь.
  • Формат файла не поддерживается - используйте PNG, BMP, JPG.
  • Изображение не отображается - возможно, не вызван blit() после screen.fill().

Как добавить звук?

Для звуков используется модуль pygame.mixer. Предварительно следует инициализировать каналы.

pygame.mixer.init()
laser_sound = pygame.mixer.Sound('laser.wav')
laser_sound.play()

Python making games (создание игр на python)

Проблемы:

  • Без вызова pygame.mixer.init() звук не воспроизведётся.
  • Поддерживаются форматы WAV, OGG, MP3 (с ограничениями).
  • Громкость регулируется через set_volume().

Как создать анимацию спрайта?

Анимация строится на смене кадров по таймеру. Удобно использовать список изображений и счётчик кадров.

frames = [pygame.image.load(f'walk_{i}.png') for i in range(4)]
current_frame = 0
frame_counter = 0

# в главном цикле:
frame_counter += 1
if frame_counter % 10 == 0:
    current_frame = (current_frame + 1) % len(frames)
screen.blit(frames[current_frame], (x, y))

Проблемы:

  • Слишком быстрая смена кадров - отрегулируйте задержку через frame_counter или pygame.time.get_ticks().
  • Разные размеры кадров - используйте pygame.transform.scale() для выравнивания.

Как реализовать движение объекта?

Движение достигается изменением координат объекта на каждом кадре, обычно с учётом нажатых клавиш или физики.

x, y = 400, 300
speed = 5

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    x -= speed
if keys[pygame.K_RIGHT]:
    x += speed
screen.blit(player_img, (x, y))

Типичные ошибки:

  • Движение не зависит от clock.tick() - скорость будет разной на разных компьютерах. Используйте дельту времени.
  • Объект выходит за границы экрана - добавьте проверки условий.

Как проверить столкновение прямоугольников?

Pygame предоставляет встроенные методы для прямоугольников (Rect) - colliderect и collidepoint.

player_rect = player_img.get_rect(topleft=(x, y))
enemy_rect = enemy_img.get_rect(topleft=(ex, ey))
if player_rect.colliderect(enemy_rect):
    print('Столкновение!')

Проблемы:

  • Прямоугольники не учитывают прозрачные пиксели - для точности нужна маска (pygame.mask).
  • Большое количество проверок коллизий снижает производительность - оптимизируйте через группы спрайтов и пространственное разбиение.

Как вывести текст на экран?

Текст отображается через объект шрифта, созданный из системного шрифта или файла.

font = pygame.font.Font(None, 36)  # шрифт по умолчанию, размер 36
text_surface = font.render('Привет!', True, (255, 255, 255))
screen.blit(text_surface, (10, 10))

Типичные ошибки:

  • Не вызывать font.render() повторно при смене текста - создаётся новый объект каждый кадр, что медленно.
  • Параметр True включает сглаживание, но требует больше ресурсов.

Как использовать группы спрайтов?

Группы позволяют управлять многими объектами одновременно - рисовать, обновлять, проверять коллизии.

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.rect = self.image.get_rect()

all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

# в цикле:
all_sprites.draw(screen)
all_sprites.update()

Проблемы:

  • Атрибуты image и rect обязательны для работы группы.
  • При удалении объекта не забывайте удалить его из группы.

Расширенные примеры использования Pygame

1. Простая физика мяча: отражение от стен и гравитация

Пример демонстрирует движение мяча с учётом гравитации и упругого отражения от границ окна.

Пример
import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

class Ball:
    def __init__(self):
        self.x = 400
        self.y = 300
        self.vx = 5
        self.vy = 0
        self.gravity = 0.5
        self.radius = 20
        self.color = (255, 0, 0)

    def update(self):
        self.vy += self.gravity
        self.x += self.vx
        self.y += self.vy
        # отражение от стен
        if self.x + self.radius > 800 or self.x - self.radius < 0:
            self.vx = -self.vx
            self.x = max(self.radius, min(800 - self.radius, self.x))
        if self.y + self.radius > 600 or self.y - self.radius < 0:
            self.vy = -self.vy * 0.9  # потеря энергии
            self.y = max(self.radius, min(600 - self.radius, self.y))

    def draw(self, surface):
        pygame.draw.circle(surface, self.color, (int(self.x), int(self.y)), self.radius)

ball = Ball()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    ball.update()
    screen.fill((0, 0, 0))
    ball.draw(screen)
    pygame.display.flip()
    clock.tick(60)
Окно 800x600: красный мяч летает по экрану, отражаясь от краёв с постепенным затуханием вертикальной скорости.

2. Система частиц с гравитацией и исчезновением

Создание эффекта взрыва с сотнями частиц, каждая из которых движется случайно и исчезает со временем.

Пример
import pygame
import random

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

class Particle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.vx = random.uniform(-5, 5)
        self.vy = random.uniform(-5, 5)
        self.gravity = 0.2
        self.lifetime = 60  # кадров
        self.color = (random.randint(200,255), random.randint(100,200), 50)

    def update(self):
        self.vy += self.gravity
        self.x += self.vx
        self.y += self.vy
        self.lifetime -= 1

    def draw(self, surface):
        if self.lifetime > 0:
            alpha = int(255 * (self.lifetime / 60))
            pygame.draw.circle(surface, (self.color[0], self.color[1], self.color[2]), (int(self.x), int(self.y)), 3)

particles = []

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            for _ in range(100):
                particles.append(Particle(event.pos[0], event.pos[1]))

    screen.fill((0, 0, 0))
    for p in particles[:]:
        p.update()
        p.draw(screen)
        if p.lifetime <= 0:
            particles.remove(p)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
При клике мышью в любом месте окна появляется фонтан из 100 частиц, которые поднимаются, а затем падают вниз и исчезают через 1 секунду.

Библиотека Pygame в Python - comments

En
Python с использованием библиотеки pygame (python)