Что такое Пигейм? Это забавная библиотека в экосистеме Python, которую вы можете использовать для создания 2D-игр, а также простых 2D-анимаций.

Сегодня я хочу показать вам, как написать бесконечную анимацию падающих драгоценных камней — совершенно не вдохновленную валютой из The Legend of Zelda :)

Код

Итак, я покажу вам полный сценарий, а затем мы пройдемся по каждому шагу по отдельности.

Строки 1–25: импорт, ссылочные переменные и запуск.

Начальная часть скрипта делает следующее:

  • Импорт библиотек
  • Определить цветовые переменные RGB
  • Переменные управления инициализацией — количество драгоценных камней для рендеринга, флаг, чтобы анимация продолжалась, и пара настроек Pygame.
  • Запустите движок Pygame

Строки 28–48: пользовательская функция для создания одного драгоценного камня.

Используемые здесь драгоценные камни шестигранные, и для их рисования требуется шесть вершин. Было бы неудобно копировать и вставлять этот код повсюду, поэтому я функционализировал эту часть.

Функция начинается с вершины top_left и вычисляет оставшиеся вершины по часовой стрелке. Все координаты X и Y также рассчитываются на основе координат top_left. Логический флаг first_gen используется для обеспечения того, чтобы первая волна драгоценных камней отображалась по всему экрану. После этого драгоценные камни всегда генерируются над верхней частью экрана, чтобы обеспечить плавный переход от исчезновения драгоценных камней внизу и появления новых драгоценных камней вверху.

Функция также выбирает случайный цвет в конце, чтобы вернуть список из 7 элементов: шесть списков [X, Y] и кортеж RGB. Справедливости ради, каждый драгоценный камень должен быть объектом пользовательского класса Python с атрибутом для каждой координаты и цвета, но я избегал классов, чтобы свести к минимуму количество понятий в этой статье.

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

Строка 51: создать список драгоценных камней

Строка 51 инициализирует список драгоценных камней посредством понимания списка: на основе количества драгоценных камней, указанного в начале скрипта с помощью num_gems, этот список вызывает функцию generate_gem столько раз, чтобы создать список драгоценных камней.

Строки 54–89: цикл while для запуска анимации.

Наконец, есть цикл while, который поддерживает выполнение анимации. Каждая итерация соответствует кадру анимации, который закрашивает экран черным цветом и рисует каждый драгоценный камень из списка gems_list.

Строки 57–59 проверяют, пытался ли пользователь закрыть окно Pygame, и если да, то переключают флаг готовности, гарантируя, что цикл завершится на текущей итерации. Когда цикл заканчивается, строка 89 завершает работу движка Pygame и скрипта с помощью метода quit.

Вернемся к строке 62. Экран должен быть заполнен черным на каждой итерации/каждом кадре, чтобы каждый раз все перерисовывалось правильно. Таким образом, логика каждого кадра состоит в том, чтобы заполнить экран черным цветом и нарисовать каждый драгоценный камень сверху.

Это именно то, что происходит в строках 65–81: перебираем все драгоценные камни в gems_list и:

  • Нарисуйте драгоценный камень на экране
  • Переместите драгоценный камень вниз, увеличивая координату Y каждой вершины — помните, что верхняя левая координата экрана равна (0,0), поэтому X увеличивается вправо, а Y увеличивается вниз.
  • Если координата bottom_middle выходит за пределы экрана, то регенерируйте драгоценный камень, вызвав generate_gem

В конце итерация вызывает метод display.flip для ожидания, пока все не будет отрисовано для отображения кадра (конечно, это происходит очень быстро, даже если код выполняется построчно). Строка 86 заставляет игру работать со скоростью 60 кадров в секунду с помощью вызова clock.tick(60).

Заключительные мысли

И это первое знакомство с Pygame. Я планирую выкладывать больше об этой библиотеке, а пока вы можете найти код на GitHub для запуска скрипта самостоятельно :)

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.