Глава 20 · Разработка игр с Pygame

Спрайты, изображения и ресурсы игры

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

Фигуры, нарисованные pygame.draw, отлично подходят для первых шагов, но настоящие игры почти всегда используют готовые изображения — ассеты. Загружаются они одной строкой:

zagruzka_izobrazheniya.py
igrok_kartinka = pygame.image.load("assets/igrok.png").convert_alpha()
screen.blit(igrok_kartinka, (x, y))

pygame.image.load() уже полностью загружает изображение — .convert_alpha() после неё не обязательна технически, но для картинок с прозрачностью её настоятельно рекомендуют вызывать сразу после инициализации экрана: она создаёт копию изображения в формате пикселей, оптимальном для повторной отрисовки именно на этом экране, и сохраняет при этом per-pixel alpha (раздел 20.17). Без неё изображение с прозрачностью обычно продолжает работать, но может отрисовываться заметно медленнее при частых вызовах blit().

«Спрайт» здесь — это изображение, а не класс Pygame
В этой главе спрайт означает просто картинку игрового объекта: мы загружаем её и рисуем через blit(). У Pygame есть и одноимённый класс pygame.sprite.Sprite вместе с группами pygame.sprite.Group, которые умеют обновлять и проверять столкновения сразу для многих объектов, — но он нам здесь не нужен, и мы к нему вернёмся в главе 21, где объектов станет заметно больше.

Откуда игра знает, где лежат файлы

Путь "assets/igrok.png"относительный: он отсчитывается от текущей рабочей директории процесса (CWD), а не от расположения самого файла с кодом. Пока вы запускаете игру из той же папки, где лежит код, разницы не заметно — но стоит запустить её из другого места (например, через ярлык или через python папка/igra.py из соседней директории), и загрузка падает с FileNotFoundError. Надёжное решение — модуль pathlib (глава 15): строить путь от расположения самого файла с кодом, а не от того, откуда его запустили.

nadezhnyj_put.py
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent
igrok_kartinka = pygame.image.load(BASE_DIR / "assets" / "igrok.png").convert_alpha()
Путь к ассету зависит от текущей директории запуска
"У меня всё работает" и "на другом компьютере FileNotFoundError" — классический симптом относительного пути, построенного без Path(__file__). Это особенно легко упустить при упаковке в исполняемый файл (раздел 20.29), где рабочая директория процесса может вообще не совпадать с папкой, откуда запущен исполняемый файл.

Организация папки проекта

Устоявшееся соглашение — держать код и ассеты раздельно, группируя ассеты по типу:

struktura_proekta.txt
moya_igra/
  igra.py
  assets/
    images/
      igrok.png
      vrag.png
    sounds/
      prygok.wav
Практика: загрузка спрайтов и надёжные пути
Pygame открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →