Как написать свою игру на python
Перейти к содержимому

Как написать свою игру на python

  • автор:

Как написать свою игру на python

Чтобы проверить результат установки, запустите пример, поставляемый вместе с библиотекой:

����️ Как написать игру на Python: 5 игровых движков При запуске игра выглядит примерно вот так ����️ Как написать игру на Python: 5 игровых движков

Спрайты в Pygame Zero называются Actors . Их характеристики требуют некоторых пояснений, так как эти сведения используются в коде примера:

  1. Для каждого Actor задаются, как минимум, изображение и положение.
  2. Все изображения должны располагаться во вложенной папке с именем ./images/ . Названия файлов должны содержать лишь строчные буквы, цифры или символы подчеркивания.
  3. При ссылке на изображение используется имя файла без расширения. Например, если изображение называется alien.png , то в программе на него ссылаются строкой «alien» .

Вывод монет через равные промежутки времени производится с помощью метода clock.schedule() . Метод принимает вызываемую функцию (в нашем случае add_coin ) и количество секунд перед вызовом самой функции. Запускаемая функция add_coin() создает объект класса Actor и добавляет спрайт в глобальный список видимых монет.

Перемещение персонажа задействует обработчик события on_mouse_move() . В исходном положении спрайт персонажа находится в центре экрана. Положение мыши хранится в глобальной переменной.

Столкновение с монетой приводит к воспроизведению звука и увеличению счёта. Удаляемая монета добавляется в список coin_remove_list . При обработке столкновений мы проверяем, не слишком ли много монет сейчас находится на экране. Если это так, мы заканчиваем игру, прекращаем создавать новые монеты и выводим окончательный счёт игры.

Обновление состояний. Функция update() вызывается Pygame Zero один раз за кадр. Мы используем её, чтобы перемещать объекты класса Actor и обновлять состояния игровых объектов. Также один раз за кадр для отрисовки вызывается функция draw() .

Заключение по Pygame Zero

Реализация игры на Pygame Zero заняла 152 строки кода вместо 182 строк на обычном Pygame. Хотя количество строк сопоставимо, версия на Pygame Zero получилась более ясной в плане кода и проще для понимания и дополнения.

Arcade

Arcade — движок Python для создания игр с современными графикой и звуком, разработанный профессором Полом Крэйвеном из Симпсон-колледжа (Айова, США).

Arcade базируется на мультимедийной библиотеке pyglet и выгодно отличается, как от Pygame, так и от Pygame Zero:

  • поддерживает современную OpenGL-графику;
  • поддерживает аннотации типов Python 3;
  • умеет анимировать с анимированными спрайтами;
  • имеет согласованные имена команд, функций и параметров;
  • поощряет отделение игровой логики от кода, обеспечивающего отображение;
  • сокращает использование шаблонного кода;
  • имеет поддерживаемую и актуальную документацию, в том числе несколько учебных пособий и полные примеры игр на Python;
  • имеет встроенные физические движки для игр с видом сверху и игр-платформеров.

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

Установка Arcade

Чтобы установить Arcade и его зависимости, используйте соответствующую команду pip:

����️ Как написать игру на Python: 5 игровых движков

Начнем с базового примера с фигурами и текстом. Чтобы запустить код, используйте следующую команду:

����️ Как написать игру на Python: 5 игровых движков

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

Конструктор Item() принимает одну или несколько строк. Первая строка — имя предмета, которое используется при печати. Остальные строки используются в качестве псевдонимов, чтобы игроку не приходилось вводить полное имя объекта.

Взаимодействие с предметами. Часто команды, которые вводит игрок, направлены на конкретный предмет. Разработчик игры может задать дополнительный контекст команды. Для этого в описании декоратора @when() используются слова, написанные заглавными буквами.

�� Пример контекста команды можно увидеть в функции look_at() , которая принимает строковый параметр с именем item . В декораторах этой функции, определяющих команды look at и inspect , слово ITEM выступает в качестве переменной-заполнителя текста, следующего за командой. Этот текст и передается функции look_at() в качестве входного значения. Например, если игрок введет look at book , то item внутри функции получит строковое значение «book» .

Реплики. Для вывода реплик используйте функцию say() , которая отлично справляется с выводом многострочного текста. Пример использования есть в теле функции look() — всякий раз, когда игрок набирает look , функция say() выводит в консоль описание текущей комнаты.

Комнаты. Для определения различных областей игрового мира библиотека adventurelib предоставляет класс Room . При создании комнаты конструктору Room() передается описание комнаты и связь с другими комнатами с помощью свойств .north , .south , .east и .west .

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

Ключ имеет не только имя и псевдонимы, но и метод, с помощью которого используется в игре. Метод key.use_item вызывается, когда игрок пытается использовать предмет, набрав строку use key .

Коллекции предметов, таких как инвентарь игрока или предметы на полу комнаты, хранятся в объекте класса Bag . Эти объекты-коллекции позволяют добавлять, удалять предметы или проверять содержимое.

В нашем коде определены четыре Bag -объекта: три для каждой комнаты и один для инвентаря, собираемого игроком. Для добавления предметов в инвентарь используется функция get() , Чтобы взять какой-либо предмет из имеющегося инвентаря — функция take() . При переносе предмета в инвентарь, он удаляется из Bag -объекта комнаты.

Продвинутый вариант игры с использованием adventurelib

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

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

В игре есть несколько областей:

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

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

Программный код игры разбит на несколько файлов:

  • adventurelib_game_rooms.py описывает комнаты и области;
  • adventurelib_game_items.py определяет предметы и их атрибуты;
  • adventurelib_game_characters.py описывает персонажей, с которыми может взаимодействовать игрок;
  • adventurelib_game.py собирает всё вместе, добавляет команды и запускает игру.

Игру можно запустить с помощью следующей команды:

����️ Как написать игру на Python: 5 игровых движков

Каждая область имеет свои свойства:

  • название, краткое и подробное описания;
  • предметы и персонажи;
  • заблокированные выходы;
  • указание на то, был ли уже игрок в этой области или нет.

Используем ООП. Чтобы быть уверенными, что каждая область имеет собственный экземпляр каждого из этих свойств, мы создадим в файле у подкласс Room с именем GameArea . Предметы в каждой комнате хранятся в объекте класса Bag с именем items , а персонажи — в characters .

Игровые предметы определены в adventurelib_game_items.py как объекты типа Item() . Одни игровые предметы необходимы для завершения игры, в то время как другие разнообразят геймплей. Некоторые элементы имеют определенные свойства, уникальные для данного элемента. Например, у мечей wooden_sword и steel_sword есть свойство, показывающее наносимый ими урон и поддерживаемые магические бонусы.

Взаимодействие с персонажами помогает продвигать игровой сюжет. Персонажи определены в adventurelib_game_characters.py . У каждого героя, как и у каждого предмета, есть связанные с ним универсальные свойства, такие как описание и приветствие, используемое, когда игрок встречает персонажа в первый раз.

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

Примеры контекста. В какой-то момент игрок впервые сталкивается со старейшиной Бэрроном (Elder Barron). Когда игрок набирает talk to elder , контекст устанавливается по свойству elder.context . Приветствие старейшины заканчивается вопросом требующим ответа «да» или «нет». Если игрок вводит yes , то в adventurelib_game.py запускается обработчик команды, заданный декоратором @when(«yes», context=»elder») .

����️ Как написать игру на Python: 5 игровых движков

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

Запрет действий в контексте. Вы также можете проверить, как помогает контекст в обработчике команд. Например, игрок не может просто выйти из боя с великаном, закончив разговор. Обработчик команды «goodbye» проверяет, находится ли игрок в контексте «giant» , который вводится, когда он начинает сражаться. Если контекст в силе, прекращать разговор нельзя, — это смертельный бой!

Команды, не имеющие совпадений, обрабатываются функцией no_command_matches() . Её можно использовать для диалогов, требующих конкретного ответа. Так, когда волшебник просит игрока разгадать загадку, создается контекст wizard.riddle . Неправильный ответ приводит к прекращению разговора.

Заключение по adventurelib

Создать полноценную текстовую приключенческую игру непросто, но adventurelib берёт на себя основную рутину, связанную с обработкой локаций, предметов, героев, а также их поведением в зависимости от истории взаимодействий.

Ren’Py

Наследником текстовых игр являются современные игры в стиле визуальных романов (новелл). В таких играх наибольшее значение также играют повествование и сюжет, но игровой опыт разнообразнее за счет картинок, визуальных эффектов и звуков. Для создания подобных игр на Python используется Ren’Py. Название движка образовано от японского слова, означающего романтическую любовь.

Строго говоря, Ren’Py не является классической библиотекой Python, которую можно установить посредством pip install . Игры Ren’Py создаются и запускаются с помощью лаунчера, входящего в состав SDK Ren’Py, в котором есть и редактор игр, и собственный язык сценариев. Однако так как Ren’Py основан на Pygame, с ним можно работать и с помощью Python.

Установка Ren’Py

Ren’Py SDK доступен на Windows, Mac и Linux, пакет для соответствующей платформы можно скачать на официальном сайте. После установки перейдите в папку, содержащую SDK, и запустите Ren’Py Launcher.

����️ Как написать игру на Python: 5 игровых движков

Базовые концепции Ren’Py

В той же программе можно начать новый проект, это создаст необходимую структуру файлов и папок. Хотя для запуска игр требуется Ren’Py Launcher, для редактирования кода можно использовать любой удобный редактор.

����️ Как написать игру на Python: 5 игровых движков

Сценарии игр Ren’Py хранятся в файлах с расширением .rpy , написанных на специальном языке Ren’Py. Файлы хранятся в папке game/ внутри папки проекта.

Для нового проекта Ren’Py создаёт следующие сценарии, которые можно сразу же использовать и редактировать:

  • gui.rpy определяет внешний вид всех элементов пользовательского интерфейса;
  • options.rpy определяет изменяемые параметры для настройки игры;
  • screens.rpy описывает стили диалогов, меню и других элементов вывода информации;
  • script.rpy — место, где вы начинаете писать игру.

Чтобы запустить примеры игры из материалов этого руководства, следуйте инструкции:

  1. Запустите Ren’Py Launcher.
  2. Нажмите Preferences , затем Projects Directory .
  3. Измените Projects Directory на папку renpy из загруженного репозитория с примерами.
  4. Нажмите Return , чтобы вернуться на главную страницу Ren’Py Launcher.

В списке проектов слева вы увидите basic_game и giant_quest_game . Выберите, что хотите запустить и нажмите Launch Project .

Ниже мы рассмотрим script.rpy для basic_game .

Метки ( labels ) **определяют точки входа в историю, а также используются для запуска новых сцен и альтернативных путей прохождения истории. Все игры Ren’Py начинают работать с метки start: , которая может появляться в любом сценарии.

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

Персонажей можно определить просто назвав их в истории или указав в начале сценария. Так мы определили главного персонажа, его маму и брата по имени Кевин. Оператор define инициализирует три переменные класса Characters .

Медиафайлы. Как и Pygame Zero, Ren’Py требует, чтобы все изображения и звуки, используемые в игре, находились в определенных папках — соответственно game/images/ и game/audio/ . В сценарии игры к ним можно обращаться по имени файла без расширения.

�� Пример. Когда ваш персонаж открывает глаза и впервые видит спальню, ключевое слово scene очищает экран, а затем показывает изображение спальни, хранящееся в day.png . Ren’Py поддерживает формы файлов изображений JPG, WEBP и PNG.

Ветвления сюжета. Игра не была бы игрой, если бы в ней нельзя было принимать решения. В Ren’Py возможности для выбора оформляются в виде меню. В ответ на выбор игра переходит к заданной метке, изменяет изображение и воспроизводит заданные звуки. В примере такой выбор возникает, когда главный персонаж понимает, что забыл свой телефон.

Продвинутый пример игры на Ren’Py

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

Персонажи и локации. В игре есть несколько персонажей: кузнец, волшебник и великан. И несколько локаций: родная деревушка, деревня оружейника, ведущая к волшебнику дорожка и пещера с грабителем-великаном.

В материалах к туториалу вы найдете четыре сценария:

  • script.rpy , где начинается игра;
  • town.rpy с историей близлежащей деревни;
  • path.rpy , который описывает тропу между деревнями;
  • giant.rpy , содержащий логику битвы с великаном.

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

Описание объектов. Как и в предыдущем примере, в начале script.rpy мы определяем объекты с помощью Character() . Далее мы задаем несколько изображений, на которые ссылаемся позже для использования в качестве фона и отображения объектов. Использование специального синтаксиса позволяет назначать изображениям короткие внутренние имена.

Активный инвентарь. Чтобы показать, какое оружие сейчас активно, мы показываем его изображение в углу экрана. Для этого мы используем команду show с модификатором with moveinleft . Важно помнить, что при смене сцены экран очищается, поэтому нужно запускать команду повторно.

Смена оружия. При входе в город в town.rpy , вы встречаете приветствующего вас кузнеца:

����️ Как написать игру на Python: 5 игровых движков

Кузнец предлагает улучшить ваше оружие. Если вы решите это сделать, вы обновите значения для current_weapon и характеристики оружия.

Операторы Python. Строки, начинающиеся с символа $ , интерпретируются Ren’Py как операторы Python. Это позволяет прописывать в сценарии произвольный код Python. Обновление current_weapon и статистики оружия выполняется с помощью трех операторов Python, которые изменяют значения переменных по умолчанию, определенных в начале script.rpy .

Вы также можете определить большой блок кода Python, используя слово python: , как показано в файле giant.rpy , начиная со строки 41.

Сцена битвы управляется функцией fight_giant() и игровым циклом с переменной battle_over . Выбор игрока сражаться или бежать отображается с помощью метода renpy.display_menu() . Если игрок сражается, то великану наносится случайное количество урона и корректируются его очки здоровья. Если великан остается в живых, он может атаковать в ответ аналогичным образом. Обратите внимание, что у великана есть шанс промахнуться, в то время как игрок всегда попадает в цель. Бой продолжается до тех пор, пока у игрока или великана не закончится здоровье, либо пока игрок не сбежит.

Используемый код очень похож на тот, который мы использовали для описания битвы в adventurelib. Пример демонстирирует, как вы можете интегрировать код Python в Ren’Py без необходимости переводить его в сценарий Ren’Py.

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

Другие популярные игровые движки на Python

Описанная в статье пятерка библиотек — лишь небольшая выборка из множества доступных игровых движков на Python. Среди десятков доступных мы отметим также следующие:

  • Wasabi 2D разработан командой Pygame Zero. Это современная среда, построенная на moderngl , которая автоматизирует рендеринг, предоставляет готовые решения для анимационных эффектов, имеет встроенные эффекты и использует собственную модель игровых событий.
  • Panda 3D — платформа с открытым исходным кодом для создания 3D-игр и трехмерной визуализации. Panda 3D переносится на разные платформы, поддерживает несколько типов ресурсов, интегрируется с многочисленными сторонними библиотеками и обеспечивает встроенное профилирование.
  • Ursina построена на основе Panda 3D и предоставляет специальный движок для разработки игр, который упрощает многие аспекты Panda 3D. На момент написания статьи Ursina хорошо поддерживается и документируется.
  • PursuedPyBear позиционируется как образовательная библиотека с системой управления сценами, анимированными спрайтами и низким входным барьером.

Если вы знаете о других хороших движках на Python, не стесняйтесь рассказать в комментариях!

Источники контента для игр

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

Разработчики-одиночки могут посчитать этот аспект разработки игр пугающим. Но к счастью, существует множество различных источников игровых ресурсов:

  • OpenGameArt.org предлагает широкий спектр артов, музыки, фонов, значков и других ресурсов для двумерных и трехмерных игр. Большинство файлов находятся в свободном доступе.
  • Kenney.nl содержит набор разнообразных бесплатных и платных ресурсов.
  • Itch.io — торговая площадка для создателей цифровых продуктов, ориентированных на независимую разработку игр. Здесь можно найти ресурсы практически для любых целей: и бесплатные, и платные, и даже готовые игры.

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

Заключение

Поздравляем — теперь вы знакомы с основами дизайна игр на Python! Благодаря стараниям GameDev-сообщества писать качественные компьютерные игры на Python сегодня намного проще, чем раньше.

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

Материалы по теме

  • �� Пишем Тетрис на Python с помощью библиотеки Pygame
  • 9 идей для начинающих программистов по созданию игр-клонов

«Разработка и создание игры на Python с помощью библиотеки Pygame»

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

Цель работы : Разработать компьютерную игру на Python с помощью библиотеки Pygame .

узнать историю возникновения компьютерных игр и библиотеки Pygame .

выбрать жанр, вид, сценарий и т.д.

установить язык программирования Python и библиотеку Pygame;

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

написать код для игры.

Пройти стадии тестирования.

Гипотеза: С помощью библиотеки Pygame и языка программирования Python, я смогу создать свою игру.

Объект исследования : Библиотеки Pygame и язык программирования Python.

Предмет исследования: Возможности технологий программирования

1. Теоретическая часть

1.1. История создания игр

История компьютерных игр начинается в 1940-х и 1950-х годах, когда в академической среде разрабатывались простые игры и симуляции. Компьютерные игры длительное время не были популярны, и только в 1970-х и 1980-х годах, когда появились доступные для широкой публики аркадные автоматы, игровые консоли и домашние компьютеры, компьютерные игры становятся частью поп-культуры.

Аркадные игровые автоматы, подобные Computer Space (1971) Нолана Бушнелла и Pong (1972) Ральфа Бера, позже прозванного «отцом видеоигр» превратили компьютерные игры из забавы для программистов в коммерческий продукт.

Переполнение рынка домашних игровых консолей однообразными играми низкого качества привело к кризису индустрии компьютерных игр 1983 года. В результате на мировом рынке компьютерных игр на протяжении долгих лет доминировали компании из Японии, в первую очередь Nintendo. В эту эпоху возникли многие серии игр, существующие по сей день, такие как Mario, Final Fantasy или The Legend of Zelda. Портативная консоль Game Boy (1989) создала обширный рынок портативных консолей и игр для них; не последнюю роль в её популярности сыграла головоломка «Тетрис» Алексея Пажитнова.

1990-е годы стали временем перехода от двухмерной графики в играх к трёхмерной. Возникновения и расцвета новых жанров, таких как шутеры от первого лица, подобных Doom (1993), и стратегии в реальном времени, подобных Dune II (1992), распространение сетей и интерес к многопользовательским играм породил режим deathmatch и массовые многопользовательские онлайн-игры.

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

1.2. Pygame

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

Изначально Pygame был написан Питом Шиннерсом (Pete Shinners). Начиная примерно с 2004-2005 года, поддерживается и развивается сообществом свободного программного обеспечения.

Pygame использует библиотеку Simple DirectMedia Layer (SDL) с намерением обеспечить разработку компьютерных игр в реальном времени без низкоуровневой механики языка программирования C и его производных. Это основано на предположении, что самые дорогие функции внутри игр могут быть абстрагированы от игровой логики, что позволяет использовать язык программирования высокого уровня , такой как Python, для структурирования игры.

1.3. Классификация компьютерной игры

Компьютерные игры классифицируют по нескольким признакам:

2. Количество игроков;

3. Визуальное представление;

Жанры игр разнообразны:

3D или 2D шутеры; Файтинги; Слешеры; Стелс-экшен; Аркада; Приключенческие; Ролевые(RPG); Экшен; Симуляторы; Головоломки.

По количеству игроков игры разделяют на 4 вида:

Одиночная игра (Синглплейер, англ. Singleplayer).

Совместная игра на одном устройстве (Hotseat, Splitscreen).

Многопользовательская игра (Мультиплейер, Multiplayer).

Массовая онлайн игра ( англ . Massively multiplayer online game, MMO).

По визуальному представлению игры можно разделить на:

Дополненная реальность (мобильные устройства с видеокамерой).

Виртуальная реальность (шлем виртуальной реальности).

По платформе игры можно разделить на следующие виды:

Персональный компьютер (ПК, PC, ноутбук, нетбук).

Игровая консоль или приставка (PS, Xbox, Nintendo).

Мобильное устройство: телефон, планшет и т.д.

Браузерная или флеш-игра (виртуальная интернет платформа).

Для своей игры я выбрал жанр 2D-шутер, игра будет одиночной, использоваться будет 2D-графика, а игра будет на платформе ПК.

1.4. Как создать игру?

Сначала нужно придумать сценарий игры:

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

Чтобы написать игру на Python необходимо не только установить сам язык программирования, но и библиотеку Pygame (набор модулей, предназначенный для написания игр). Также нужно изучить литературу, связанную с данной темой. Следующим шагом будет создание концепции игры (как она должна работать, в чем ее смысл и на кого она ориентирована).

Далее мы создаем концепт арты:

t1683276803aa.pngt1683276803ab.png

Рис.1 Главный герой Рис. 2. Враг

t1683276803ac.png

Рис.3. Основная локация

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

Практическая часть

2.1 Код игры

Теперь же можно приступать написанию кода игры.

Первым делом создаем начальные данные для нашей игры(подключение библиотеке, размер экрана, добавление названия и иконки игры):

t1683276803ad.png

Далее создаем массивы, куда закинем изображения, это и будет анимацией объектов (таких анимации я создал очень много):

t1683276803ae.png

Так же чтоб заработали анимации нужно создать условие:

t1683276803af.png

Теперь создаем цикл running , для того чтобы игра не закрывалась сразу, но до него нужно написать что gameplay , pause , proigrah приравнять False (потому что игра начинается со старта, поэтому пока что экраны проигрыша, паузы и гемплейя не нужны), а running , quitt , start == True (так как игра начинается со стартового экрана).

Сейчас надо написать условие, если start == True , то запускаем «старт» параметры и изображения (в приложении вы можете ознакомиться с экраном старта):

t1683276803ag.png

Такие же условия делаем для геймплея, паузы и проигрыша (с экранами проигрыша и паузы вы можете ознакомиться в приложении):

t1683276803ah.png

t1683276803ai.png

В условии геймплея мы прописываем все самое важное (ознакомиться с экраном геймплея вы можете в приложении):

Код ходьбы, стрельбы и прыжков героя.

Код перемещения врагов и их смерти.

Код для запуска снарядов, их попадания по врагам.

Код для сердца, счетчика сердец и снарядов.

Код для иконки паузы и перехода в сам экран паузы.

Код при проигрыши игрока и переход на экран проигрыша.

И многое другое.

t1683276803aj.png

Теперь чтобы выйти из игры нужно написать ещё условие:

2.2. Тестирование игры

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

Изучив библиотеку Pygame и его принципы, я разработал 2 D -шутер игру, для того чтобы дети начали следить за гигиеной. Программа игры состоит из огромного цикла и множества условий. Так же в ходе проекта был выбран: жанр, количество игроков, визуальное представление и платформу. Работа игры заключается в том, что герой должен победить все вирусы, и следить за здоровьем. На достигнутом результате я не буду останавливаться и продолжу заниматься созданием игр, а также изучать все тонкости языка программирования Python и его библиотеки Pygame.

Список использованной литературы

1. Программируем на Python | Доусон Майкл – 416 с.

2. Python,PyGame and Raspberry Pi Game Development | Sloan Kell –220 c.

Здесь вы можете посмотреть экран старта:

t1683276803ak.png

t1683276803al.png

Экран паузы и проигрыша:

Мини-туториал по созданию текстового RPG на Python

Мини-туториал для новичков по созданию текстовой PRG-игры на языке Python. Внутри — код с подробными комментариями.

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

Для начала нам нужен randint.

from random import randint 

Теперь можем сделать классы.

class Player: hp = 100 damage = 10 # Записываем в переменную, чтобы было удобно. p = Player() class Enemy: # Рандомно получает хп врага от 70 до 130, рандомно получает дамаг врага от 6 до 13. hp = randint(70,130) damage = randint(6,13) # Записываем в переменную, чтобы было удобно. e = Enemy() 

Пожалуй, можно сделать меню.

def menu(p): while True: print("1) Сражаться") print("2) Посмотреть статистику") # try и except просто фиксят ошибки. Не обращайте внимания. try: n = input("Введите число: ") if n == 1: menu_fight(p) if n == 2: menu_stats(p) else: print("Чего ждем?") except NameError: print("Введите число") except SyntaxError: print("Введите число") 

Статистика тоже не помешает.

def menu_stats(p): print("Статистика игрока") print("*****************") # Попробую обьяснить, что значит %s. Она по последовательности списка вписывает в %s переменную. print("hp ") print("damage: ") input("Нажмите Enter для продолжения.") 

Теперь потруднее, нужно сделать сражение.

def menu_fight(p): while e.hp > 0: # Также, как я и сказал по последовательности списка расставляет переменные. print(f"Вы hp: damage: ") print(f"Враг hp: damage: ") print("**********************") print("1)Ударить") print("2)Хил 0-5") n = input("Введите число: ") if n == 1: # Здоровье врага отнимает от вашего дамага. e.hp -= p.damage print("Вы ударили противника, у него осталось %s hp")%(e.hp) # Здоровье игрока отнимает от дамага врага. p.hp -= e.damage print("Противник ударил вас, у вас осталось %s hp")%(p.hp) print("*********************") if n == 2: # Рандомно от 0 до 5 добавляет хп. p.hp += randint(0,5) # Если здоровье игрока больше, то хп игрока будет равна 100. if p.hp > 100: p.hp = 100 print("Ваши хп %s")%(p.hp) else: print("Чего ждем?") if p.hp < 0: print("Вы проиграли") if e.hp < 0: print("Вы победили") print("******************")

Под конец осталось просто вызвать меню.

# Вызов меню. menu(p) 

Полный код

from random import randint class Player: hp = 100 damage = 10 # Записываем в переменную, чтобы было удобно. p = Player() class Enemy: # Рандомно получает хп врага от 70 до 130, рандомно получает дамаг врага от 6 до 13. hp = randint(70,130) damage = randint(6,13) # Записываем в переменную, чтобы было удобно. e = Enemy() def menu(p): while True: print("1) Сражаться") print("2) Посмотреть статистику") # try и except просто фиксят ошибки. Не обращайте внимания. try: n = input("Введите число: ") if n == 1: menu_fight(p) if n == 2: menu_stats(p) else: print("Чего ждем?") except NameError: print("Введите число") except SyntaxError: print("Введите число") def menu_stats(p): print("Статистика игрока") print("*****************") # Попробую обьяснить, что значит %s. Она по последовательности списка вписывает в %s переменную. print("hp %s."%(p.hp)) print(f"Вы hp: damage: ") print("damage %s."%(p.damage)) input("Нажмите Enter для продолжения.") def menu_fight(p): while e.hp > 0: # Также, как я и сказал по последовательности списка расставляет переменные. print("Вы hp: %s damage: %s")%(p.hp, p.damage) print("Враг hp: %s damage: %s")%(e.hp, e.damage) print("**********************") print("1)Ударить") print("2)Хил 0-5") n = input("Введите число: ") if n == 1: # Здоровье врага отнимает от вашего дамага. e.hp -= p.damage print("Вы ударили противника, у него осталось %s hp")%(e.hp) # Здоровье игрока отнимает от дамага врага. p.hp -= e.damage print("Противник ударил вас, у вас осталось %s hp")%(p.hp) print("*********************") if n == 2: # Рандомно от 0 до 5 добавляет хп. p.hp += randint(0,5) # Если здоровье игрока больше, то хп игрока будет равна 100. if p.hp > 100: p.hp = 100 print("Ваши хп %s")%(p.hp) else: print("Чего ждем?") if p.hp < 0: print("Вы проиграли") if e.hp < 0: print("Вы победили") print("******************") # Вызов меню. menu(p)

Спасибо, что прочитали. Можете дать советы, мне будет интересно почитать.

Библиотека Pygame / Часть 1. Введение

Это первая часть серии руководств «Разработка игр с помощью Pygame». Она предназначена для программистов начального и среднего уровней, которые заинтересованы в создании игр и улучшении собственных навыков кодирования на Python.

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

Что такое Pygame?

Pygame — это «игровая библиотека», набор инструментов, помогающих программистам создавать игры. К ним относятся:

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

Игровой цикл

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

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

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

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

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

Время

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

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

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

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

# Pygame шаблон - скелет для нового проекта Pygame import pygame import random WIDTH = 360 # ширина игрового окна HEIGHT = 480 # высота игрового окна FPS = 30 # частота кадров в секунду 

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

# создаем игру и окно pygame.init() pygame.mixer.init() # для звука screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock() 

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

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

# Цикл игры running = True while running: # Ввод процесса (события) # Обновление # Визуализация (сборка) 

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

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

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

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

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

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

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

>>> 256 * 256 * 256 16,777,216 

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

# Цвета (R, G, B) BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) 

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

 # Рендеринг screen.fill(BLACK) 

Но этого недостаточно. Дисплей компьютера работает не так. Изменить пиксель — значит передать команду видеокарте, чтобы она передала соответствующую команду экрану. По компьютерным меркам это очень медленный процесс. Если нужно нарисовать на экране много всего, это займет много времени. Исправить это можно оригинальным способом, который называется — двойная буферизация. Звучит необычно, но вот что это такое.

Представьте, что у вас есть двусторонняя доска, которую можно поворачивать, показывая то одну, то вторую сторону. Одна будет дисплеем (то, что видит игрок), а вторая — оставаться скрытой, ее сможет «видеть» только компьютер. С каждым кадром рендеринг будет происходить на задней части доски. Когда отрисовка завершается, доска поворачивается и ее содержимое демонстрируется игроку.

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

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

 # Рендеринг screen.fill(BLACK) # после отрисовки всего, переворачиваем экран pygame.display.flip() 

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

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

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

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

 for event in pygame.event.get(): # проверить закрытие окна if event.type == pygame.QUIT: running = False 

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

Контроль FPS

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

while running: # держим цикл на правильной скорости clock.tick(FPS) 

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

Итог

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

# Pygame шаблон - скелет для нового проекта Pygame import pygame import random WIDTH = 360 HEIGHT = 480 FPS = 30 # Задаем цвета WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # Создаем игру и окно pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock() # Цикл игры running = True while running: # Держим цикл на правильной скорости clock.tick(FPS) # Ввод процесса (события) for event in pygame.event.get(): # check for closing window if event.type == pygame.QUIT: running = False # Обновление # Рендеринг screen.fill(BLACK) # После отрисовки всего, переворачиваем экран pygame.display.flip() pygame.quit() 

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *