Как сделать игру платформер на питоне

Добавил пользователь Дмитрий К.
Обновлено: 19.09.2024

Код в уроках был написан на Python 3.7 и Pygame 1.9.6

Что такое Pygame?

  • Графика и анимация
  • Звук (включая музыку)
  • Управление (мышь, клавиатура, геймпад и так далее)

Игровой цикл

В каждом кадре происходит масса вещей, но их можно разбить на три категории:

Речь идет обо всем, что происходит вне игры — тех событиях, на которые она должна реагировать. Это могут быть нажатия клавиш на клавиатуре, клики мышью и так далее.

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

В этом шаге все выводится на экран: фоны, персонажи, меню. Все, что игрок должен видеть, появляется на экране в нужном месте.

Время

Еще один важный аспект игрового цикла — скорость его работы. Многие наверняка знакомы с термином FPS, который расшифровывается как Frames Per Second (или кадры в секунду). Он указывает на то, сколько раз цикл должен повториться за одну секунду. Это важно, чтобы игра не была слишком медленной или быстрой. Важно и то, чтобы игра не работала с разной скоростью на разных ПК. Если персонажу необходимо 10 секунд на то, чтобы пересечь экран, эти 10 секунд должны быть неизменными для всех компьютеров.

Создание шаблона Pygame

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

В начале программы нужно импортировать необходимые библиотеки и задать базовые переменные настроек игры:

Дальше необходимо открыть окно игры:

pygame.init() — это команда, которая запускает pygame. screen — окно программы, которое создается, когда мы задаем его размер в настройках. Дальше необходимо создать clock , чтобы убедиться, что игра работает с заданной частотой кадров.

Теперь необходимо создать игровой цикл:

Игровой цикл — это цикл while , контролируемый переменной running . Если нужно завершить игру, необходимо всего лишь поменять значение running на False . В результате цикл завершится. Теперь можно заполнить каждый раздел базовым кодом.

Раздел рендеринга (отрисовки)

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

Таблица цветов RGB

Экраны компьютеров сделаны из пикселей, каждый из которых содержит 3 элемента: красный, зеленый и синий. Цвет пикселя определяется тем, как горит каждый из элементов:

Каждый из трех основных цветов может иметь значение от 0 (выключен) до 255 (включен на 100%), так что для каждого элемента есть 256 вариантов.

Узнать общее количество отображаемых компьютером цветов можно, умножив:

Теперь, зная, как работают цвета, можно задать их в начале программ:

А после этого — заполнить весь экран.

А это значит, что процесс отрисовки происходит один раз за кадр, а не при добавлении каждого элемента.

В pygame это происходит автоматически. Нужно всего лишь сказать доске, чтобы она перевернулась, когда отрисовка завершена. Эта команда называется flip() :

Главное — сделать так, чтобы функция flip() была в конце. Если попытаться отрисовать что-то после поворота, это содержимое не отобразится на экране.

Раздел ввода (событий)

Игры еще нет, поэтому пока сложно сказать, какие кнопки или другие элементы управления понадобятся. Но нужно настроить одно важное событие. Если попытаться запустить программу сейчас, то станет понятно, что нет возможности закрыть окно. Нажать на крестик в верхнем углу недостаточно. Это тоже событие, и необходимо сообщить программе, чтобы она считала его и, соответственно, закрыла игру.

События происходят постоянно. Что, если игрок нажимает кнопку прыжка во время отрисовки? Это нельзя игнорировать, иначе игрок будет разочарован. Для этого pygame сохраняет все события, произошедшие с момента последнего кадра. Даже если игрок будет лупить по кнопкам, вы не пропустите ни одну из них. Создается список, и с помощью цикла for можно пройтись по всем из них.

В pygame много событий, на которые он способен реагировать. pygame.QUIT — событие, которое стартует после нажатия крестика и передает значение False переменной running , в результате чего игровой цикл заканчивается.

Контроль FPS

Пока что нечего поместить в раздел Update (обновление), но нужно убедиться, что настройка FPS контролирует скорость игры. Это можно сделать следующим образом:

Команда tick() просит pygame определить, сколько занимает цикл, а затем сделать паузу, чтобы цикл (целый кадр) длился нужно время. Если задать значение FPS 30, это значит, что длина одного кадра — 1/30, то есть 0,03 секунды. Если цикл кода (обновление, рендеринг и прочее) занимает 0,01 секунды, тогда pygame сделает паузу на 0,02 секунды.

Наконец, нужно убедиться, что когда игровой цикл завершается, окно игры закрывается. Для этого нужно поместить функцию pygame.quit() в конце кода. Финальный шаблон pygame будет выглядеть вот так:

Ура! У вас есть рабочий шаблон Pygame. Сохраните его в файле с понятным названием, например, pygame_template.py , чтобы можно было использовать его каждый раз при создании нового проекта pygame.

В следующем руководстве этот шаблон будет использован как отправная точка для изучения процесса отрисовки объектов на экране и их движения.

Как установить


Однозначного ответа на вопрос о том, какую версию python скачивать, не существует. До 2019 эксперты ещё не решили, какая версия лучше подходит для написания игр. Но чтобы не возникало лишних проблем и вопросов, лучше скачать 3.7.

Файл установщика займет примерно 26 мегабайт на диске. Двойным кликом на него откроется стандартное диалоговое окно, в котором нужно проставить галочки и запустить инсталляцию.

В самом конце, когда платформа будет установлена, она предложит убрать ограничение длины служебной переменной. Эта функция влияет на запуск Python из любого места системы компьютера. Необходимо просто кликнуть на текст в рамке.

Чтобы проверить правильность установки, нужно открыть командную строку и вписать туда слово python. После нажатия на Enter должен появится номер версии и список из нескольких команд для освоения в новой системе.

Для более удобного взаимодействия дополнительно необходимо установить Code VS.

Теория

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

Pygame

Для создания собственной игры нужно работать со средой Pygame. Это так называемая игровая библиотека. Если проще, то набор инструментов, которые способствуют созданию игр.

Это три основных аспекта:

  1. Звуки (как музыка внутри игры, так и звук открытия дверей, падения шара и т. п.).
  2. Управление (привязанное к чему угодно, как классические средства ввода, так и различные геймпады).
  3. Графика и анимированные вставки.

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

В таком кадре происходит огромное количество процессов, но для понятности их можно разделить всего на три вида:

  1. Обновление. Это изменение всех предметов или явлений, происходящих за один кадр. Например, если объект подпрыгнул, его силой гравитации должно потянуть обратно к земле. Или если две движущиеся машины сталкиваются, то они должны отскочить друг от друга и получить повреждения.
  2. Ввод. Реакция программы на то, что происходит вне поля кода. То есть клики мышкой, какие-либо нажатия клавиатуры, управление стиками геймпада.
  3. Прорисовка. Этап, на котором код превращается в фон, персонажей, выпадающее меню, окружающую среду и прочие вещи, которые пользователь должен увидеть при взаимодействии.

Скорость работы цикла

FPS или Frames Per Second – количество кадров в секунду. Термин, знакомый любому геймеру. Многие знают только то, что для комфортной игры это значение должно быть больше 60. Программисты же понимают термин так: значение, указывающее количество повторений цикла за одну секунду.

Это необходимо для того, чтобы написанная программа не была слишком быстрой или медленной. Также важно, чтобы разные ПК или ноутбуки обрабатывали такое значение с одинаковой скоростью. Если машина должна ехать 7 секунд до столкновения, то это время не должно изменяться на разных компьютерах.

Практика

Ознакомившись с теоретической частью, можно начинать создавать свою первую игру. Самый первый шаг – создание обычной программы pygame, которая откроет окно и запустит цикл игры. Собственно, это и есть начало любого кода на питоне.

Для начала необходимо выбрать библиотеки и импортировать их, а также задать три основных значения дальнейшей игры.


Первая и вторая строка отвечает за библиотеки, а все остальные — за разрешение окна и количество обновления циклов за секунду.

Теперь откроем само окно игры. Первая строчка запускает игровую библиотеку. Третья выполняет развертывание окна по заданным изначально параметрам, у нас это 1024×720. Пятая создается для того, чтобы мы могли убедиться в правильности частоты кадров.


Третьим шагом идет создание цикла игры. И далее пошагово прописываются три основных события, которые будут происходить в сцене. За сам цикл отвечает команда while, которая контролируется переменной running. Значит, если мы хотим завершить игру, нужно изменить значение переменной с TRUE на FALSE. Теперь заполняем все три строки тем кодом, который нам необходим.

Отрисовка

У нас нет ничего, кроме окна с фоном, с ним и будем работать. Можно его залить цветом, но как? Сколько цветов может обрабатывать компьютер?

Чтобы вычислить это значение, необходимо возвести число 256 в третью степень. Получим значение 16 777 216. Многовато для запоминания.

Экран состоит из пикселей, и каждый может обработать три базовых цвета: зеленый, синий, и красный. Цвет определенного пикселя зависит от того, как горят базовые. Ниже представлена таблица RGB цветов.

Красный Зеленый Синий Цвет
0 0 0 Черный
255 0 0 Красный
0 255 0 Зеленый
0 0 255 Синий
0 255 Голубой
255 255 0 Желтый
255 0 255 Пурпурный
255 255 255 Белый

Каждый из цветов имеет значение от 0 до 256, где 0 — это выключенная функция, а 255 — включенная на максимум. Таким образом, регулируя три основных цвета, можно добиться нужного. Поэтому таблицу цветов назвали RGB, по аналогии с заглавными буквами трех основных цветов.

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

YELLOW = (255, 255, 0)

После того как мы задали командой желтый, можем выполнить заливку экрана.

Двойная буферизация

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

К нашей команде screen.fill(YELLOW) добавляем строку pygame.display.flip, и все начинает работать.

Эта функция должна находиться в самом конце отрисовки, иначе содержимое, которое задано после флипа, просто не отобразится на экране пользователя.

События

Так как у нас отсутствует игра, мы не можем точно угадать, какие кнопки меню или управления нам будут необходимы. Если прямо сейчас запустить программу, будет ясно, что окно просто так не закроется. Мы не рассматриваем возможность нажать на красный крестик в углу, так как это недостаточно для конечного игрока.

Закрытие – функция, которая должна быть сообщена программе для того, чтобы была возможность считать её и завершить процесс. Если проще, чтобы значение TRUE было заменено на FALSE.

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

Использовать окно кода просто чтобы создать статичную картинку – недостаточно. Pygame хранит все события, которые происходили с момента отрисовки последнего кадра. Язык не будет пропускать команды, сколько бы их ни было. Программа в окне создает список действий, а цикл FOR пройдет по всем.

Одно из важнейших событий pygame.QUIT, оно запускается после нажатия крестика и меняет значение переменной Running с TRUE на FALSE, тем самым заканчивая игровой цикл.

Шаблон

В конечном итоге у нас должен появиться вот такой вот шаблон для написания проекта на pygame.


Последней, 30-й, строчкой обязательно пишем окончание программы, чтобы она нормально закрывалась.

Создание окружения

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

Кроме того, мы можем нарисовать несколько простейших объектов:

  • Line (создание линии);
  • Circle(создает окружность);
  • Rect (создает квадрат).

Есть много других методов и команд, но эти три являются самыми распространенными в использовании новичками.

В конце цикла всегда надо обновлять сцену, чтобы на ней отрисовывались кадры, за это отвечает команда pygame.display.update

Запуск игры в окне без этой программы приведет к слишком быстрому движению, и воспринимать ее будет невозможно.

Создание простейшей игры с числами

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


1 и 3 строка отвечают за то, чтобы переменной NTG было задано число от 0 до 200, а также чтобы число пользователя изначально было -1.

5 строка — это цикл, который будет выполняться, пока переменная NTG не совпадет с переменной, введенной пользователем в окне программы.

Строки с 6 до 10 делают основную работу и дают игроку подсказки, в какую сторону отличается написанное число. Если оно совпадет с NTG, выведется строчка, поздравляющая с победой (11).

Последняя, 13, отвечает за конец игры и завершение цикла. Второй способ, чтобы не проставлять значения TRUE и FALSE.

Но исходя из знаний, полученных выше, мы можем доработать программу, сделав окно немного интереснее. Так как в этой игре нет персонажей и объектов, заменим фон строками

YELLOW = (255, 255, 0)

Зададим желтый фон экрана. Теперь компиляция программы в окне будет более интересной. Вот и создана первая простая игра без использования pygame.

Змейка

Создавать игру будем с помощью виджета Canvas. Это нужно для того, чтобы задать объекты изображениями. Также это поможет зарегистрировать столкновение и закончить игру.

Всего возьмем 5 переменных:

  1. DELAY – скорость игры.
  2. ALL_DOTS – количество сегментов змейки, которое может быть.
  3. RAND_POS – чтобы яблоко появлялось в случайной точке.
  4. HEIGHT и WIDTH – отвечают за размер игрового поля.
  5. DOT_SIZE – размер одного сегмента и яблока.

Зададим два массива:

В них сохраняются все соединения нашего существа.


Эти 11 строк отвечают за то, чтобы в нашей игре было три картинки, сегмент, голова змеи и яблоко. Их можно как отрисовать самостоятельно, так и скачать из интернета. Три небольших изображения, которые будут у нас показываться в окне игры.

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


Этими командами мы создадим изображения на холсте. За это отвечает команда image. Если мы хотим, чтобы изображение появлялось около границ окна, нам нужно задать параметр anchor на NW (North и West). А с помощью параметра tag можем отслеживать и идентифицировать все изображения и объекты в окне. Одним тегом можно обозначить группу объектов в нашей игре.

С помощью команды checkApple мы смотрим, съела ли наша змея яблоко, и добавляем ей сегмент в случае положительного ответа. Команда find_withtag находит один из предметов в окне, используя определенный заданный тег. Нам требуется всего два объекта — яблоко и змеиная голова.

Если яблоко будет съедено, то есть столкнется с головой, мы создадим новый сегмент на месте столкновения. И запустим метод locateApple, он удалит яблоко из холста и создаст новое в рандомной точке.

Мы управляем головой змейки, а метод doMove поможет нам изменять ее положение. Остальные сегменты будут двигаться за головой одной непрерывной цепочкой.

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

Вывод

В итоге мы научились создавать простенькие игры без графики, сделали шаблон для создания программы на pygames и начали делать серьезную программу типа змейки. Все эти навыки помогут в дальнейшем создании игр и прояснят фундаментальные аспекты кодинга на Python. При любых неполадках или отказе компилятора в запуске кода необходимо проверить все строки кода на ошибки и попробовать заново написать программу в другом окне. Нужно быть максимально внимательным, и тогда все получится.

Создаем игру с Pygame и Python

Если вы задумываетесь над созданием собственной игры, но не хотите переходить на другой язык ради карьеры разработчика игр, то для этого есть решение! С помощью модуля Pygame вы можете использовать навыки Python для создания игр, от базовых до очень сложных. В сегодняшней статье вы узнаете, как использовать Pygame, сделав клон игры Asteroids! Для начала создадим главный класс нашей игры, в который входят: обработка пользовательского ввода, логика игры, отрисовка игровых объектов.

Для правильной организации проекта создадим новую директорию и перейдем в нее:


>>> mkdir game_project
>>> cd game_project

Далее создадим виртуальную среду и установим нужную версию pygame:

(my_progect)>>> pip install pygame==2.0.0

В папке game_project создадим файл game.py Далее импортируем модуль pygame для получения доступа ко всем его функциям

Следующим шагом создаем класс игры, c конструктором класса где инициализируем pygame, так как это идеальное место для размещения любых методов, необходимых для инициализации Pygame.

Изображения в Pygame представлены поверхностями. Поверхности можно рисовать друг на друге, что позволяет создавать сложные сцены из простых картинок. В каждом проекте Pygame есть одна специальная поверхность. Эта поверхность представляет собой экран и является той, которая в конечном итоге будет показана игрокам. Все остальные поверхности должны быть нарисованы на этой в какой-то момент. В противном случае они не будут показаны. Чтобы создать поверхность отображения, программа использует pygame.display.set_mode(). Единственный аргумент, который вы передаете этому методу, - это размер экрана, представленный кортежем из двух ширина и высота. В этом случае Pygame создаст экран шириной 800 пикселей и высотой 600 пикселей.

def main_loop(self):
while True:
self._handle_input()
self._process_game_logic()
self._draw()

def _init_pygame(self):
pygame.init()
pygame.display.set_caption('Космические преключения')

def _handle_input(self):
pass

def _process_game_logic(self):
pass

def _draw(self):
self.screen.fill((0, 0, 255))
pygame.display.flip()

Функция main_loop() - это игровой цикл. Он содержит три шага для каждого кадра: _handle_input содержит обработку входных данных. _process_game_logic содержит игровую логику. _draw содержит чертеж. В методе _init_pygame() происходит одноразовая инициализация Pygame. Метод делает две вещи: Вызывает pygame.init(). Эта единственная строка кода отвечает за настройку удивительных функций Pygame. Каждый раз, когда мы работаем с Pygame, мы должны вызывать pygame.init() в начале нашей программы, чтобы убедиться, что фреймворк будет работать правильно. Следующая строка устанавливает заголовок программы Pygame с помощью pygame.display.set_caption(). В этом случае надписью будет название вашей игры: Космические приключения. Методы _handle_input() и _process_game_logic() обрабатывают действия игрока и задают игровую логику. Пока они пусты, но в следующей статье мы добавим некоторый код.

Метод _draw() уже имеет некоторый код. Он вызывается каждый кадр, чтобы нарисовать содержимое экрана, и делает это в два этапа: заполняет экран цветом с помощью функции screen.fill(). Метод принимает кортеж с тремя значениями, представляющими три базовых цвета: красный, зеленый и синий. Каждое значение цвета колеблется от 0 до 255, представляя его интенсивность. В этом примере кортеж (0, 0, 255) означает, что цвет будет состоять только из синего, без следов красного или зеленого. Далее обновляет содержимое экрана с помощью pygame.display.flip(). Поскольку ваша игра в конечном итоге будет отображать движущиеся объекты, метод будет вызываться каждый кадр, чтобы обновить дисплей. Из-за чего необходимо заполнять экран цветом каждый кадр, так как метод очистит содержимое, сгенерированное во время предыдущего кадра. Теперь наш код хорошо структурирован и имеет методы с описательными именами. В следующий раз, когда нам нужно будет изменить что-то, связанное с графикой, мы будете знать, что нужно использовать _draw(). Чтобы добавить обработку ввода, вы измените функцию _handle_input() и так далее.

Таким образом мы создали класс, который будет отображать основные игровые объекты и отвечать за логику игры. В следующей статье мы применим его и реализуем обработку пользовательского ввода.


Python – это очень популярное и быстрое решение, которое во многих случаях обходит аналогичные скриптовые языки. Он очень доступен, т.к. в сети полно сайтов, форумов, документов и обучающих статей, электронных книг, в том числе посвященных непосредственно разработке игр.

Для основы стоит рассмотреть такие библиотеки как: PyOgre, PySFML, PySDL и Allegro.

Для разработки 2D-проектов я бы рекомендовал ознакомиться с такими достаточно популярными движками и наборами инструментов: PyGame, Pyglet, Python Arcade Library, Ren’Py, Cocos2D, FIFE, Ignifuga Game Engine.


Например, Ren’Py часто называют конструктором игр, ведь на нём даже начинающие игроделы с лёгкостью делают собственные игрушки в жанре визуальная новелла. Сказывается то, что он заточен под жанр, а для создания такой игры не требует обширных знаний в программировании на Python, ведь игра в основном состоит из набора диалогов, сцен с фоном и персонажами, переход между которыми происходит от выбранного игроком диалога. Питон ещё используется, например, в Metagam – это конструктор браузерных MMORPG старого типа. Для 3D MMO разрабатывался движок World Forge, но он, судя по всему, уже заглох несколько лет как.

Для разработки 3D-игр я бы рекомендовал следующие популярные решения: Panda3D SDK, Ursina Engine (поддерживает Python 3.6), Blender Game Engine, UPBGE и Delta3D Engine.


Также хотелось бы отметить, что сейчас набирающий популярность игровой 2D/3D-движок Godot использует для программирования сценариев собственный скриптовый ЯП GDScript - это несложный и достаточно лаконичный синтаксис, основанный на Python.

Для игр с нетребовательной трёхмерной графикой, если вы не гонитесь за современными визуальными эффектами, я бы посоветовал ещё WorldSim3D – отечественный движок, базируемый на исходниках открытого движка Irrlicht. Ранее в WorldSim3D использовал только FreeBASIC, но с версии 1.12 появилась поддержка других языков: C/C++, D, Pascal и Python, конечно же.

создание 2d платформера на python изучение библиотеки pygame

Zivert - CRY | Премьера клипа

04:24

LOBODA - Americano (Премьера сингла, 2021)

03:31

Баста – Любовь и страх (feat. Дворецкая)

05:41

Ozoda - Esla Meni (Offıcıal Clıp 2021)

05:02

Султан Лагучев - Cкучает осень (премьера 2021)

02:29

Oliver Tree & Little Big - The Internet [Music Video]

03:36

Coldplay X BTS - My Universe (Official Video)

04:43

Читайте также: