Спрайты, изображения и ресурсы игры
Готовые изображения загружаются одной строкой — но путь к ним должен считаться от расположения кода, а не от того, откуда его запустили.
Фигуры, нарисованные pygame.draw, отлично подходят для
первых шагов, но настоящие игры почти всегда используют готовые изображения — ассеты.
Загружаются они одной строкой:
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().
blit(). У Pygame есть и одноимённый класс pygame.sprite.Sprite вместе с группами pygame.sprite.Group, которые умеют обновлять и проверять столкновения сразу для многих объектов, — но он нам здесь не нужен, и мы к нему вернёмся в главе 21, где объектов станет заметно больше.Откуда игра знает, где лежат файлы
Путь "assets/igrok.png" — относительный: он
отсчитывается от текущей рабочей директории процесса (CWD), а не от расположения самого
файла с кодом. Пока вы запускаете игру из той же папки, где лежит код, разницы не заметно —
но стоит запустить её из другого места (например, через ярлык или через
python папка/igra.py из соседней директории), и загрузка
падает с FileNotFoundError. Надёжное решение — модуль
pathlib (глава 15): строить путь от расположения самого файла с
кодом, а не от того, откуда его запустили.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
igrok_kartinka = pygame.image.load(BASE_DIR / "assets" / "igrok.png").convert_alpha()
Path(__file__). Это особенно легко упустить при упаковке в исполняемый файл (раздел 20.29), где рабочая директория процесса может вообще не совпадать с папкой, откуда запущен исполняемый файл.Организация папки проекта
Устоявшееся соглашение — держать код и ассеты раздельно, группируя ассеты по типу:
moya_igra/
igra.py
assets/
images/
igrok.png
vrag.png
sounds/
prygok.wav