#Руководства
- 11 окт 2018
-
24
Как программировать игры: языки, движки и все, что нужно знать начинающему разработчику
Сперва это кажется дико сложным, но чем глубже погружаешься, тем лучше получается. Рассказываем, как начать делать игры,
vlada_maestro / shutterstock
Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Главное — в самом начале узнать, что нас ждёт, чтобы потом не свернуть на полпути, пройти все этапы и выпустить релиз. Подробно всем тонкостям, навыкам и хитростям мы обучаем на курсе «Профессия разработчик игр на Unity». Здесь же рассмотрим первые шаги, которые ждут разработчика.
Рассчитываем, что вы уже придумали, какой будет игра, разработали концепт и уже ищете способы разработки. Настало время реализовать свои задумки. Есть несколько вариантов, как это сделать.
- Написать всё с нуля — сложный способ, но лучше начать с него, чтобы разобраться с языками.
- Использовать движки — вариант полегче. Даже новичок, вооружившись мануалами из интернета, способен создать игру на одной из популярных платформ.
- Найти заготовки — готовых шаблонов порой достаточно, чтобы выдать игру за свою, поменяв компоненты на свои.
Все три способа подразумевают какое-никакое программирование, так что знать хотя бы основы вам точно придётся.
Подойдут любые, от Python и C до Pascal и Java. От выбора зависит то, сколько времени уйдёт на игру и для какой платформы будет релиз. Также язык влияет на производительность.
На C++, например, пишут для любой платформы, а вот PHP или JavaScript лучше подходят для браузерных игр. Если же вы используете один из движков, то лучше вдобавок изучать C# — на нём прописывают скрипты. Главное — не недооценивать языки. Движок Unity дружит и с JavaScript, а MineCraft был написан на Java.
Среди современных выделим:
CryEngine
Crysis, Far Cry, Sniper II: Ghost Warrior.
Unreal Engine
Gears of War 4, Dead Pool, Mortal Kombat X, Tekken 7
Unity
Outlast, Assassin’s Creed: Identity, Temple Run, Deus Ex: The Fall.
Большой популярностью пользуется Unity, он рассчитан как на 2D-, так и на 3D-игры. Он подходит под разные платформы и языки. На нём создается большинство мобильных и инди-игр. Он бесплатный, но если вы зарабатываете на своих играх больше 100 тысяч долларов в год, то придётся делиться ими с разработчиками Unity.
Допустим, вы выбрали язык и движок, составили план. Что дальше? Продумайте всё от и до. В зависимости от выбранного вами пути (чистый язык или использование движка) будет отличаться и то, что вас ждёт на разных этапах разработки.
Если делаете всё своими силами, то на ваши плечи ляжет работа над физикой, механикой, графикой, искусственным интеллектом и балансом. Если выбрали движок — можно вздохнуть спокойно.
Физика — это то, как мир игры реагирует на действия игрока или объектов внутри мира. Вот какие могут быть физические действия:
- ходьба;
- езда;
- прыжки;
- удары;
- выстрелы;
- падение предметов и так далее.
Если пишете сами, то для обычного прыжка придется:
- проверить, находится ли игрок на земле;
- менять координату Y, чтобы игрок поднимался вверх;
- закончить подъём через какое-то время;
- начинать и продолжать падение до тех пор, пока под ногами игрока не окажется земля.
Не говоря уже о том, что нужно работать над анимацией всего этого.
function jump() {
If(gamer.jumpTimer >= 1) {
gamer.y++;
gamer.jumpTimer --;
} else {
If(gamer.y >= ground.y) {
gamer.y--;
}
}
}
В движках уже прописана физика, и нужно лишь подогнать её под свои нужды. Для примера:
- Вы поместили объект в рабочую область Unity.
- Указали, что для него нужно использовать физику.
- При запуске игры объект упадёт.
И для этого не придётся писать код вообще — всё уже предусмотрено.
Игровая механика — это то, какими способами игрок взаимодействует с миром. Совокупность игровых механик составляет игровой процесс. Например, вы уже реализовали возможность ходьбы и прыжков. Эта игра, скорее, платформер.
А если добавите механику получения опыта, повышения уровней, прокачки навыков, — игра станет походить на RPG. Механика — такая же важная составляющая игры, как и сюжет или графика.
Ещё один пример: вы написали сценарий к игре, в которой нужно сбежать из тюрьмы. Даже если игра будет самой линейной в мире, игровая механика может всё изменить:
- если добавить стрельбу, то будет экшн;
- если игрок будет безоружен, — стелс;
- если ещё и замки нужно взламывать, то это уже головоломка или пазл.
Будучи программистом, придётся уделять много времени механике.
Раньше графика создавалась с помощью программного кода, потом придумали текстуры и спрайты, а для 3D-игр используются модели. Подготовив все текстуры и модели, нужно добавить их в игру.
В движке достаточно просто загрузить нужные файлы и прикрепить их к нужным моделям. Иначе — прописывать всё вручную, в том числе и анимацию.
Для анимации 2D-объектов создаётся текстура по типу той, что на изображении выше. Она разбивается на равные части, которые сменяют друг друга. То есть игрок сначала видит первый кадр, который потом сменяется на второй, а затем на третий — это создает иллюзию движения.
Если брать 3D-модель, то используется скелетная анимация — модель как бы нанизывается на специальный каркас (скелет) с подвижными частями. Движение этих частей прописывается в коде.
На скриншоте видно, как персонаж сгибает руку в местах с точками (вершинами). Таких точек может быть очень много, если требуется сложная анимация — жесты, мимика и так далее.
Создаётся анимация так: прописываются точки координат или захватываются движения реального актера.
Первый способ сложный, но дешёвый, потому что от программиста требуется только прописать движения — сдвинуть точку A1 на координаты (50,240).
Второй проще, потому что достаточно одеть актеров в специальные костюмы с маячками, отснять это и перенести в игру. Но тут, конечно, придётся оплатить костюмы, павильон, работу операторов, постановщиков и актёров.
Чтобы играть было интересно, нужен баланс. Это значит, что у каждого противника должны быть сильные и слабые стороны. Так геймплей не превратится в убийство одуванчиков или десятичасовые перестрелки с боссом.
Например, если в шутере есть оружие с большим уроном, у него должна быть долгая перезарядка. Если урон маленький, перезарядка может быть быстрой. У бронированных врагов малая подвижность, а шустрые противники умирают с нескольких ударов или выстрелов.
Если геймплей предусматривает взаимодействие с NPC, то им нужно прописать модели поведения: реакцию на действия игрока, агрессивность, возможность вести диалоги или торговать.
Работа с ИИ — одна из самых сложных, потому что стоит учитывать множество ситуаций, для которых задумана реакция. Например, когда вы пытаетесь пройти в дверь, ваш компаньон обязательно должен преградить вам путь, чтобы жизнь малиной не казалась.
Разобравшись с тем, как всё будет устроено в игре, можно приступать к разработке. Но чтобы проект был коммерчески успешен, выбирайте популярные платформы. Всего можно выделить четыре:
- Персональные компьютеры.
- Приставки.
- Мобильные устройства.
- Браузер.
У каждой из этих платформ своя аудитория с вполне конкретными предпочтениями. На мобильных устройствах предпочитают головоломки (2048, 94%, Cut the Rope), аркады (Subway Surf, Temple Run, Angry Birds) и казуалы (Talking Cat Tom, Kitty Kate Baby Care, Hair Stylist Fashion Salon).
На компьютерах играют в MMORPG (Lineage II, World of Warcraft, Skyrim) или шутеры (Battlefield, Call of Duty, Counter-Strike).
Приставки подходят для гонок (Need for Speed, Blur, Burnout Paradise), приключенческих игр (Assassin’s Creed, Portal, The Walking Dead) и так далее.
В браузерах собирают пазлы и строят фермы.
Конечно, можно сделать и головоломку для PS4, и гонку для браузера — никто никого не ограничивает.
Будьте готовы к тому, что ваша первая игра не станет шедевром. Но не расстраивайтесь, потому что такие проекты отлично подходят для обучения.
Подтяните свои навыки в программировании, чтобы научиться создавать игры, изучите современный язык, который часто используется разработчиками, и выпустите свой первый проект. А наш курс поможет вам в этом.
Научитесь: Профессия Разработчик игр на Unity с нуля до Middle
Узнать больше
Инструкция начинающего разработчика игр
Время на прочтение
12 мин
Количество просмотров 218K
В данной инструкции я попытался осветить основные моменты разработки игр. Инструкция будет полезна для людей, собирающихся заняться разработкой игр в роли лидера (главного разработчика и организатора).
Хочу отметить, что игры бывают разные – большие и маленькие, сложные и лёгкие, и поэтому для каждой игры эта инструкция верна в какой-то своей определённой степени. Охватить всё не удалось, но передать общие моменты, думаю, получилось.
И так Вы решили сделать свою игру, о чём Вам нужно подумать…
Думаем – нужно ли это тебе
Перед тем, как за что-то взяться, необходимо всё обдумать. А перед тем, как заняться разработкой игр, необходимо обдумать всё очень хорошо. Очень часто начинающие разработчики, достигнув определённых успехов в чём-то (сделал мод для игры, небольшой фан-сайт и пр.), начинают грезить созданием своей игры. Это происходит из-за того, что они имеют слабое представление о процессе разработки игр.
Я перечислю основные ошибки в их представлении:
- Нет романтики. Многие начинающие разработчики, наигравшись вдоволь в игры, приходят к мысли, что создавать игры также интересно, как и играть, только чуть-чуть сложнее. Это очень частая ошибка. Чем больше и сложнее игра тем, скучнее и безынтереснее процесс её разработки. Романтики совершенно нет.
- Трудно и даже невозможно. Многие после нескольких (или даже одного) успешного проекта наполняются уверенностью, что написать игровой проект им по силам. На самом деле, игры – это одно из самых сложных направлений разработки. И чем «серьёзнее» игра, тем проект сложнее. В процессе создания игры разработчик может столкнуться с нерешаемыми проблемами, которые убивают на корню энтузиазм даже у самых упёртых.
- Отвращение к играм. Со временем у каждого матёрого разработчика игр развивается отвращение к играм. Сначала просто они становится менее интересными. Затем начинаешь замечать, что они вовсе не интересны, а интересно только, как они работают. Чем дальше, тем хуже.
- Конкуренция и качество продукта. Играми занимаются многие студии и независимые разработчики. Существует своеобразный «уровень вхождения» в этот бизнес. Сейчас нельзя сделать успешную игру, нарисованную акварелью (да, такие игры встречались в начале 2000-х). Она просто не выдержит конкуренции. Соответственно, абы что не сделаешь. Тут скрывается важный психологический момент – начинающий разработчик вынужден делать хороший продукт, иначе он будет испытывать постоянное чувство страха неуспешности своего продукта.
- Время и ресурсы. И самая распространенная ошибка – это то, что ресурсов (время, деньги, знания) им хватит. Чтобы понять объём работ, читайте следующие пункты.
Концепция и ТЗ
Когда-то давно я написал довольно неплохую статью о концепции проекта. За последние пару лет мои взгляды слегка поменялись, но суть осталась та же.
- Что же такое концепция? Концепция игрового проекта — это документ, описывающий цели, задачи, основные особенности проекта, исследование рынка и целевой аудитории, условия его выполнения. Также, так как проект игровой, обязательно описание игровой механики, игровых понятий, примерный сценарий и концепт-арт. Если Вы ещё рассчитываете делать проект не в одиночку (что весьма вероятно), то понадобится ещё техническое задание (ТЗ) – документ, содержащий описание необходимых работ, сроки и условия.
- Зачем нужна концепция? Очень хороший вопрос. Зачем заниматься какой-то «писаниной», когда нужно собирать команду и писать код?
В первую очередь концепция нужна, чтобы самому получить полноценное представление о конечном результате и оценить объём работ. Без чёткой и продуманной концепции у Вас в итоге получится, соответственно, противоречивая и непродуманная игра. Без концепции существует большая вероятность возникновения ошибок организации игровой механики или ошибок реализации.
Во вторую очередь концепция нужна для того, что бы другие поняли то, что Вы хотите сделать. Все члены команды должны работать над одним общим проектом. Об этом общем проекте члены команды узнают из документа концепции проекта. Это нужно, чтобы не было расхождений в представлениях о конечном результате. Если Вы решили создать игру и для этого собираете команду, то первые вопросы от будущих членов команды будут: «А что предстоит мне сделать? Что в итоге мы должны получить?». Вы должны будете им предоставить концепцию проекта и ТЗ. Без концепции и ТЗ Вы не привлечёте ни одного нормального специалиста. - Объёмы. Весьма интересен вопрос объёма концепции. Тут необходимо отталкиваться от сложности игры и её разработки. Если у Вас простая игра, Вы работаете один и Вы способны удержать идею игры в своей голове, то можно вообще не писать концепцию. Если удержать в памяти все моменты нельзя, то необходимо перенести их на бумагу (или другой носитель). Если Вы будете работать в команде или использовать помощь других людей (инвесторы, художники и прочие), то Вам просто необходима развёрнутая концепция и ТЗ для каждого человека. Критерий один – понятность. Нужно чтобы любой человек, ознакомившись с концепцией и ТЗ, представил конечный результат, так же как и Вы.
Обратите внимание на то, что, если Вы понимаете свою концепцию, то это не значит, что её поймут другие. Написание концепции выполняет роль «лакмусовой бумажки». Если Вы не можете написать понятную концепцию (примерно, 5 страниц для небольшой игры, несколько десятков страниц для большой), то вряд ли Вы закончите в итоге проект. - Детальность. В концепции должны быть ответы на все вопросы. После прочтения концепции должно сформироваться полное представление о проекте. Специалисты первым делом смотрят на концепцию, если концепция окажется для них не полной и непонятной, то они не будут с Вами работать.
Отдельно стоит упомянуть концепт-арт. Он должен быть, хотя бы в простейшем виде. Он является доказательством решения проблемы с контентом, содержимым игры (смотрите следующий раздел). - Русский язык. Для многих это серьёзная проблема. Если документ концепции содержит множество грамматических, орфографических и синтаксических ошибок, то ни один специалист не воспримет его всерьёз. Помните: незнание русского языка очень вредит бизнесу.
- Время. Желательно в сразу в ТЗ указать сроки выполнения работ. Проблема в том, как оценить это время, если никогда подобным не занимался. Точно ответа на этот вопрос Вы никогда не получите, всё придёт с опытом. Я только дам один совет: учитывайте не только время разработки, но и время на исправление ошибок (примерно 50% от времени на разработку).
Контент
Я специально выделил этот раздел, так как он является решающим в процессе разработки игр. Под контентом понимается всё содержимое игры, с которым взаимодействует пользователь. Это графика (растровая, векторная, 3D), музыкальное и звуковое сопровождение, видеоряд, сценарий и текст. Также сюда следует добавить медиаматериалы, используемые для продвижения игры (реклама, банеры и прочие).
В английском языке есть такое понятие как «artist» обозначающие сразу художников, музыкантов, режиссёров, писателей и прочих творцов. К сожалению, в русском языке нет нормального аналога этого слова, поэтому я дальше буду использовать понятие «создатель контента».
Разберём основные моменты этого раздела.
- Сложность. Это самая главная проблема в вопросе контента. Оказывается, в большинстве случаев подготовка контента является самой сложной задачей, сложнее написания программного кода, сложнее тестирования и отладки, и сложнее реализации игры. Естественно, если игра маленькая, то это не так заметно, а если большая, то на долю создателя контента выпадает до 80% работы по проекту.
- Объёмы. Часто из-за того, что разработчики никогда не выполняли задачи создателей контента, им очень сложно оценить объёмы. Кажется, что там такого ¬– пара десятков картинок и 3-4 звука. Но если посчитать, то получается 40 крупноразмерных изображений, 400 мелких изображений, два десятка звуков (я привел пример среднестатистической BMMORPG). Хорошо, что это всё можно подсчитать при подготовке концепции.
- Качество. Во-первых, надо понимать, что игроки работают непосредственно с контентом. Во-вторых, надо помнить, что существует огромное количество игр-конкурентов с хорошим контентом. Можно сделать вывод: игра с плохим контентом будет не конкурентоспособна, т.е. контент в игре должен быть высокого качества.
- Время. Вполне логично, что на подготовку больших объёмов качественного контента уходит очень много времени. Времени уходит больше, чем на все остальные направления вместе взятые (маленькие игры не в счёт). Учитывайте это, когда будете планировать и рассчитывать сроки.
- Стоимость контента. Хороший контент стоит «хороших» денег. Очень «хороших» денег, которых у начинающих разработчиков игр обычно нет. Многие разработчики питают иллюзорную надежду найти «бесплатного» создателя контента (или дешёвого). Найти можно, но он либо будет создавать низкопробный контент, либо создаст для Вас немного контента, а затем переметнётся к тем, кто будет ему платить. Короче говоря, «бесплатного» создателя хорошего контента Вы никогда не найдёте. Именно по этой причине нет хороших «OpenSource» игр.
- Воровство. Из-за существования проблемы дорогого контента, иногда появляются разработчики игр, которые его воруют. Мол, что такого?.. возьму-ка я из этой игры десяток картинок, а фоновые изображения найду на DA, а в качестве фоновой музыки поставлю пару любимых песенок Rammstein. Проблема в том, что авторское право контента достаточно легко подтвердить. У «жертвы» воровства есть либо исходные файлы контента, либо документ о передаче контента от его создателя. Для воров контента очень велик шанс нарваться на статью 146 УК РФ.
- Единый стиль. Ещё один важный момент, о котором часто забывают. Что бы игра смотрелась цельной и продуманной, ей нужно иметь единый стиль. Создатели контента не роботы, поэтому делают работы в своём индивидуальном стиле. Отсюда можно сделать вывод: желательно чтобы содержимое игры создавало как можно меньше человек.
- Дилемма. После прочтения описанных выше моментов можно построить следующую цепочку: Конкурентоспособная игра требует использование качественного контента. Качественный контент может сделать только профессиональный создатель контента. Профессиональный создатель контента стоит недёшево. Решений данной проблемы всего лишь три:
- Не делать игру, то есть отказаться от направления разработки игр.
- Найти инвестора. Но тут сразу нас поджидает проблема концепт-арта. Кто будет подготавливать концепт-арт, если нет денег на художника? А без концепт-арта никто не будет инвестировать в Вас.
- Решать проблему собственными силами. То есть кто-то из членов команды должен быть создателем контента и должен получать зарплату, даже если все остальные сосут палец.
Программирование
Как ни странно, создание программного кода для игр не является самой сложной задачей, но в тоже время и не является простой.
- Команда. В отличие от создателей контента программистов для своей команды найти легко. Это объясняется тем, что при определённом уровне подготовки написание программного кода игры не такая уж сложная задача. Можно найти «бесплатных» программистов, готовых работать ради интереса. А за плату и «имя» (упоминание, как разработчика игры) можно найти программиста, который будет писать хороший годный код. Но… сейчас не начало 2000-х и программисты поумнели. Первым делом адекватный программист попросит разработчика продемонстрировать концепцию и ТЗ. Затем спросит про создание контента или финансирование, которое пойдёт на его создание. Специалисты прекрасно понимают, что незачем вкладывать силы в изначально провальный проект. Если у Вас нет концепции и не решен вопрос с контентом, то нормального программиста Вы не найдёте.
- Сначала делаем большое, потом маленькое. Достаточно простой совет, но ему чаще всего не следуют. Игровой проект в большинстве случаев сложен и имеет множество зависимостей. Все это сложно просчитать на уровне составления концепции, частенько приходиться что-то менять в планах. Поэтому, чтобы не выполнять двойную работу, сначала необходимо сделать общую работающую конструкцию (прототип), а затем углубляться в детали.
- Что сначала контент или код? Прочитав раздел про контент, Вы уже, наверное, поняли, что современные игры основаны на контенте, а не на программировании. Отсюда дилемма – код подгонять под контент или контент подгонять под код. Оба подхода имеют место в современном процессе разработки. Если подгонять код под контент, то нагрузка падает на программиста, время разработки увеличивается. Это дешёвый способ. Если контент подгонять под код, то нагрузка с программиста спадает, и при учёте, что контент подготавливают наёмные работники, время разработки сокращается. Это дорогой способ, так как нагрузка падает на наёмных создателей контента. Заранее оцените ситуацию и придерживайтесь одного из подходов.
- Нерешаемые ошибки. Это даже не проблема, а предубеждение. Разработка игры весьма сложный процесс. Бывает, что разработчик сталкивается с нерешаемыми проблемами (либо решаемыми крайне тяжело) и ему приходиться пересматривать чуть ли не весь проект. Психологически это очень трудно. Многие, даже самые упёртые разработчики, попав в такой «тупик», теряют энтузиазм и закрывают проект. Предубеждение в том, что все считают, что с ними такого не случиться. Совет один: будьте психологически готовы пересмотреть весь проект и выполнить работу заново.
- Журналы. Совет лично от меня. Ведите три журнала:
- Журнал выполненной работы по проекту для отслеживания динамики разработки;
- Журнал идей по проекту, чтобы не забыть их и, если возможно, включить в концепцию;
- Журнал найденных багов и ошибок, которые необходимо исправить в будущем.
Эти три журнала помогут избежать ошибок и двойной работы в процессе разработки.
- Время. При определении времени, которое планируется на написание кода, часто делают одну ошибку – не учитывают затраты времени на исправление багов и отладку кода.
- Авторство программного кода. Определённый «маразм» наблюдается, у некоторых программистов. Они считают, что обладают абсолютными правами на код, который ими написан, что даже после релиза игры они могут предъявить права на «часть кода» игры. Что бы защитить это «священное» право они могут пойти на всякие низости (программные бомбы, бакдоры, отказ от передачи исходных кодов и прочие). Мой совет прост – остерегайтесь таких неадекватных программистов. Программный код не контент. Доказать его авторство очень сложно. Поэтому нормальный программист сначала договаривается, что он получит за код; затем его пишет; потом передаёт разработчику и получает вознаграждение; после чего уже ни на что не претендует. Также должно быть организовано и в команде.
Тестирование
О тестировании начинающие разработчики обычно не задумываются, а зря, так как на него тратиться немногим меньше времени, чем на написание программной части. В этом разделе есть два важных момента:
- Тестирование сторонними людьми. В процессе разработки тестирование проводиться в основном своими средствами. Со временем глаза привыкают к имеющимся игровым моментам, вырабатываются умение работать в данной системе, короче, ошибки становятся менее заметными. Поэтому устраивайте периодические тесты продукта сторонними людьми, которые никогда не видели ваш продукт. Следите за их реакцией на различные игровые моменты, как они воспринимают меню игры и, вообще, расспросите их общее впечатление. Поверьте мне, один такой тест даст Вам очень большой объём полезной информации. Проводите их чаще, прислушивайтесь к обратной связи, и Вы получите на выходе хорошую игру.
- Женщины. Когда-то я написал неплохую статью про женщин и игры. Смысл в том, что женщины видят всё по другому. Поэтому, желательно, чтобы в тесте игры участвовала хотя бы одна женщина (девушка), даже если игра не рассчитана на женскую аудиторию. Их обратная связь будет невероятно полезна.
Организационные моменты
- Команда. Как Вы могли догадаться, созданием таких проектов, как игры, лучше заниматься командой. Это обосновано тем, что создание контента совершенно другой вид деятельности отличный от программирования и организации проекта и одному заниматься такими разными видами деятельности сложно. Минимальная команда – это два человека, создатель контента и разработчик. Чтобы не было непонимания, уточню – наёмный работник, по-моему, тоже в какой-то мере член команды.
Конечно, можно заниматься разработкой и в одиночку. Есть такие «сумасшедшие», которые и пишут код, и рисуют графику, и сочиняют музыку, но это их проблемы.
Собрать команду при наличии финансирования легко – форумы программистов и создателей контента, биржи фрилансеров Вам в помощь. При отсутствии финансирования можно найти только программиста, а вот нормального создателя контента не найдёте – здесь надо надеяться либо на себя, либо на удачу. - Юридическое оформление. Здесь всё просто. Хотите иметь с игры деньги и обезопасить себя от рейдерского захвата (когда кто-то внаглую ворует вашу игру), то вам нужно юридическое оформление на уровне индивидуального предпринимателя. Если Вы ещё собираетесь распределять проект по долям, то нужно оформление на уровне ООО. Поэтому если при поиске членов команды Вы обещаете долю в проекте, то не удивляйтесь, что Вас будут просить предъявить реквизиты вашей организации.
- Контакты. Никогда не пренебрегайте знакомствами. Знакомьтесь с другими разработчиками, общайтесь и обменивайтесь контактами. В будущем, возможно, знакомство с ними принесёт Вам пользу.
- Реклама. Так как игр на рынке много, то чтобы пользователи выбрали именно вашу игру, нужно привлечь к себе внимание. Делается это при помощи рекламы на различных ресурсах. Логично, что реклама эта требует: во-первых денег, а во-вторых, рекламный контент (банеры, видеоролики, статьи). Возможны и другие способы ¬– связи, спам, рекламные акции и прочие, но они не всегда эффективны.
Без рекламы игра, точно также как и без контента, является провальным проектом. Обратите на это внимание. Но тут ситуация может достаточно легко исправлена инвестированием и сторонней помощью. - Инвестирование. Понятное дело, что с деньгами игру делать гораздо легче, но без развёрнутой концепции (с концепт-артом), команды и рабочего прототипа никто не будет финансировать ваш проект. То есть на начальных этапах на финансирование не надейтесь. А вот на последних этапах разработки ситуация может в корне поменяться – могут появиться инвесторы и Вам всё равно будут нужны деньги для организации рекламной компании.
Чтобы найти инвесторов, собирайте контакты. - Сторонняя помощь. Вместо инвесторов можно найти стороннюю помощь (реклама за рекламу, помощь в распространении за процент и прочие). Тут надо ориентироваться по ситуации. Чтобы найти стороннюю помощь, так же собирайте контакты.
Послесловие
Инструкция получилась большой, материала много. Крайне советую прочесть её начинающим разработчикам игр, так как, возможно, она поможет им избежать ошибок в будущем.
UPD: Статья получилась успешной, даже очень. Но в комментариях прослеживаются замечания по поводу отсуствия романтики и отвращения к играм. Поэтому я прокомментирую эти моменты.
Многие опускают тот факт, что статья для
начинающих
разработчиков игр, претендующих на роль
лидера
(первый абзац статьи). Не буду отрицать, что со временем, когда приобретаешь опыт разработки игр и жизнь складывается удачно, возвращается романтика и отвращение спадает. Но в самом начале, когда начинаешь с нуля, после того как столкнёшься с первыми серьёзными проблемами, эта романтика и любовь к играм исчезает ко всем чертям. Разработка игр — это не прогулка по ковровой дорожке в розывых очках, а блуждание в лабиринте Минотавра, где много тупиков.
Я не собираюсь своей статьёй вселять в начинающих разработчиков уверенность. Они должны знать, что путь разработчика игр сложен, что они могут встретить нерешаемые проблемы, что их нерализованный проект будет для них символом поражения.
Оглавление:
- Какой язык нужен для игр
- Движки и языки, на которых они написаны
- Как выбрать платформу
- Основные компоненты
- Как строится код
- Этапы создания
- С чего начать разработчик
- Что полезного посмотреть
- Коротко о главном
Главный вопрос в следующем: вы хотите создать одну игру и забыть о ней или сделать карьеру в геймдеве?
Если вас интересует только создание простой игры, то вам не обязательно изучать десятки языков, движков и технологий: существует множество готовых способов создания игр для начинающих разработчиков, например, на JavaScript и Pygame. Если это как раз ваш сценарий — нет никакой необходимости изучать C++.
Хочу стать профессионалом в геймдеве
Если вы хотите сделать карьеру в геймдеве, то учить C++ (например) — точно придётся, это лишь вопрос времени. Знание этого языка поможет вам, даже если вы не будете работать на нем регулярно. Как только вы освоите C++, вы сможете легко перейти к другим языкам, которые как раз и используются в программировании игр. И это не только языки группы С.
Какой язык программирования нужен
Языков — очень много. Но профессионалам геймдева, в конце концов, требуется 2-3 языка, не больше. В любом случае, понадобится C++ — это самый важный язык программирования в индустрии игр. Другие языки, которые вы должны знать: Python — для сред сборки, C# — для написания инструментов и Lua — для написания сценариев.
Пример скриптинга на Lua
Но если вам нужно сконцентрироваться на чём-то одном и то, что 100% пригодится в дальнейшем — это C++. Единственное исключение из этого правила: если вы хотите писать игры для устройств iOS (iPhone и iPad) — учите Objective-C.
Вот самые популярные инструменты, которые сегодня применяются в геймдеве:
- Unity.
- CryEngine.
- RPG Maker.
- Unreal.
- LibGDX.
- Godot.
- Game Maker (только 2D)
Примечание: если вы хотите использовать другой движок, вы можете это сделать. Но нужно чёткое и логичное обоснование, почему вам не подходит, например, тот же Unity или Unreal. Ведь эти движки отлажены, стабильны, используются профессионалами годами. Поэтому, позволяют создать игру практически любой сложности, как с точки зрения механики, графики, физики или сложности геймплея.
Независимо от того, какой язык вы выберете, знать C++ будет полезным навыком для геймдева. Вы будете понимать компьютеры на более низком уровне. Эти знания помогут создавать лучшие игры с точки зрения производительности и эффективности.
Пример элементарной игры на C++
С языком С++ вы лучше понимаете компьютеры, а следовательно — можете создавать более понятный для машин код. Вам не обязательно понимать все аспекты, но знать: указатели, их назначение понимать, как хранится память — обязательно.
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Игровые движки
Для программирования игр пригодны далеко не все языки. Например, тот же Python — предназначен для удобства чтения. И на самом деле он используется в геймдеве, но для второстепенных задач (например, для создания прототипов игровых идей). Для разработки конечного продукта — Python не подходит. Ниже мы разобрали пять языков, которые точно пригодятся разработчику игр.
Lua
Легкий скриптовый язык, который используется во многих отраслях, включая гейм-разработку. Lua прост в изучении и использовании, а также быстр (что, кстати, является необычным сочетанием).
Скрипты Lua часто используются с мощными движками, например, с Unreal Engine
Lua часто используется для разработки игровой логики, и его можно встраивать в другие языки программирования. Это делает его хорошим выбором для разработки игр со сложной механикой.
Хотя некоторые игровые движки поддерживают Lua, он не так широко используется, как другие языки, но все же — это отличный выбор для создания 2D-игр.
Популярные игровые движки, использующие Lua:
- Solar2D.
- LÖVE.
- Gideros.
Недостатки Lua:
- Используется не повсеместно.
- Ограничен индустрией.
C++
Хороший язык программирования для gamedev, потому что он быстрый и эффективный. Разработчики игр используют C++ для создания высокопроизводительных игр, а еще он имеет множество инструментов отладки.
В чем разница между С++ и C#
C++ — это реально очень сложный язык для обучения, поэтому начните свои первые шаги с хорошего игрового движка. Создавать игровые движки — также очень сложно, но вот писать игры поверх готовых движков — гораздо проще. Существует множество бесплатных движков, хотя большинство из них — это просто рендеры 3D-графики.
C++ априори будет быстрее, чем C#, но для запуска игры он требует больше времени. С++ также может показаться более сложным (например, из-за указателей).
И в С++ вообще очень много вещей, которые могут сбить с толку, если вы не разбираетесь в программных компонентах компьютера. Если вы не разбираетесь в аппаратной части и не хотите разбираться — лучше выбрать C#.
Почему С++ быстрее
Будучи компилируемым языком, C++ преобразуется в машинный код перед запуском на компьютере. Благодаря этому программы на C++ выполняются быстрее, чем на интерпретируемых языках, таких как Python.
Пример простой игры на С++
C++ также предлагает различные парадигмы программирования (объектно-ориентированное и на основе данных). Многие из самых популярных игровых движков поддерживают C++, а это значит, что существует множество инструментов и готовых библиотек, которые разработчики могут использовать для создания своих игр.
Популярные движки, использующие C++:
- Unreal Engine.
- Unity.
- CRYENGINE.
- Amazon Lumberyard.
Минусы C++:
- Сложно изучать.
- Небезопасное управление памятью.
- Не кроссплатформенный. Да, вы можете написать код на C++, который будет компилироваться на разных платформах, однако, скомпилированные двоичные файлы не будут кроссплатформенными. Кроме того, многие функции и библиотеки зависят от платформы. Так что, написание действительно кроссплатформенного кода на C++ — будет ограничено.
Язык C#
Обладает многими теми же преимуществами, что и C++. Особенно хорошо подойдет для разработки 2D- и 3D.
Одним из плюсов C# перед C++ является фактор простоты: его легче изучить. C# также является кроссплатформенным языком, что означает, что игры, разработанные на C#, можно запускать на Windows, macOS и Linux.
Пример игры на Unity, созданной на основе языка C#
Интеграция между C# и Visual Studio (также созданной Microsoft) превосходна, как и все инструменты отладки / тестирования.
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Популярные движки, использующие C#:
- Unity.
- Unreal Engine.
- Godot.
Недостатки C#:
- Широко не используется.
- Ограничен экосистемой Microsoft.
C# намного проще в использовании, но он медленнее, чем C++. В основном потому, что вы не можете выполнять действия более низкого уровня, как это возможно в C++. Также будет легче отлаживать и понимать, что именно делает ваш код (комментарии, имена переменных и функций помогут на первых порах), что всегда является плюсом.
Что выбрать для игр: C# или C++
- Если вы собираетесь использовать C# — выбирайте Unity.
- C++ поддерживается большим количеством движков. Оптимальные варианты — Unreal или Godot.
Java
Универсальный и мощный язык программирования, который широко используется во многих отраслях. Java также хороший выбор для разработки игр, поскольку обладает многими достоинствами C++, а также работает на различных платформах.
Будучи платформо-независимым языком, благодаря виртуальной машине JVM, игры на Java можно запускать на любой операционной системе, включая Windows, macOS и Linux.
Игра на языке Java
Java популярный выбор для разработки и мобильных игр, поскольку его можно запускать на устройствах iOS и Android. Кроме того, Java — язык для разработки нативных приложений в Android Studio.
Некоторые игровые движки поддерживают Java, хотя он не так быстр, как C++, что может быть существенным недостатком для некоторых типов игр.
Движки, использующие Java:
- jMonkeyEngine.
- libGDX.
- Java 3D.
Недостатки:
- Сложный для изучения.
- Может быть медленным, особенно в устаревших устройствах.
- Не так популярен как C++.
JavaScript
Еще один универсальный язык, который используется и для разработки игр. Его главное преимущество в том, что он относительно прост в изучении.
JS не так быстр, как C++ или Java, но он подходит для разработки двухмерных игр.
Эта игра на JavaScript занимает около 13 килобайт
Игры на JavaScript можно запускать в любом браузере и это существенно облегчает их распространение. Но, все равно, игры на JavaScript — гораздо менее популярны и востребованы, чем игры на других языках. Все же JS — для веба.
Популярные движки, использующие JavaScript:
- Phaser.
- PixiJS.
- Cocos2d-x.
Недостатки JavaScript:
- Не такой быстрый, как другие языки.
- Не так распространен в gamedev.
- Ограничен браузером.
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Как выбрать платформу
Какой движок лучше всего подходит для геймдева? Все зависит от того, какой продукт вы хотите разработать и сколько у вас ресурсов. Есть большая разница, когда вы single-разработчик и разработчик, которому помогает команда. Выбор платформы зависит и от масштаба игры.
Пример игры на Godot
Вот лучшие движки для различных целей:
- 2D: Buildbox и Godot.
- 3D: Unity и Unreal Engine.
- Разработка для iOS: SpriteKit (только 2D).
- Создание для Android: Unity.
- Мобильный движок, удобный для новичков: Buildbox и Unity (судя по огромному количеству обучающих материалов).
- Кроссплатформенный движок (мобильный, ПК и игровые консоли): Unity и Unreal Engine.
- Движки без кода: Buildbox и Gamemaker.
- Разработка гиперказуальных продуктов: Buildbox и Unity.
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Основные компоненты игры
Игровая механика. Какой выбор может сделать игрок, сколько вариантов прохождения, что разрешено (и запрещено) — это лишь небольшая часть механик. Разработчики должны программировать механику в широком смысле.
Механике нужно уделять колоссальное количество времени. Разработчик определяет: как именно персонаж будет коммуницировать и взаимодействовать с внутриигровым миром и его объектами. Примеры механики: прокачка героя, прохождение квеста, настройка оружия.
Прокачка уровня героя является одним из элементов игровой механики
Механика должна быть реализована правильно, кроме того нужно тестировать альтернативные варианты механик.
Механики диктуют, как играть в игру, без них геймплея не будет. В конце концов, нет особого смысла играть в игру, если ее правила не имеют смысла или противоречат друг другу.
Тема и сеттинг. Эти компоненты определяют общую эстетику игры. Если все сделано правильно, тема и сеттинг должны хорошо сочетаться с механикой.
Место действия Far Cry 4 — Кират, вымышленная страна в Гималаях. Описание игрового мира и есть сеттинг
Создание мира. Многие разработчики не уделяют должного внимания созданию мира и окружения, в котором существует персонаж. Создавая среду или вселенную, важно понять: будет ли персонаж исследовать мир, экспериментировать с игровой механикой, взаимодействовать с темой и сеттингом.
Серия GTA — пример проработанного и открытого мира с которым можно взаимодействовать
Сценарий. Сюжет часто является движущей силой и мотивацией для прохождения. Сценарий и сюжет должны работать вместе с механикой, чтобы повышать интерес и мотивацию к прохождению. Неважно простой или сложный сценарий стоит за игрой, он должен быть разнообразным.
Многие тайтлы хочется проходить, не в последнюю очередь, из-за интересного сюжета
При этом важно, чтобы сценарий представлен в последовательной и понятной форме, чтобы персонаж мог с ним взаимодействовать. Если сюжет / повествование / история беспорядочны, игра может развалиться.
Звук и музыка. Эти компоненты часто упускают из виду, но хороший звуковой ландшафт может действительно оживить мир. Использование стоковых звуков — наоборот может испортить впечатление от игры.
Многие удачные игрушки мы помним только благодаря качественной музыке
В заключение следует отметить: ключевые элементы игры определяют, насколько она подходит для своей аудитории. Важно понять: чего хотят игроки, и попытаться удовлетворить их потребности. Пытаться внедрить инновации или даже создать свой собственный жанр — всегда сложнее.
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Как строится игровой код
Игровой код строится вокруг главных компонентов игры. Разберем те, которые используются чаще всего: ИИ, физика, баланс, механика и графика.
ИИ
Это модели и сценарии поведения NPC. Разработчику придется программировать, например, реакцию на попытку начать диалог с персонажем или поведение в случае совершения героем определенного действия.
NPC в Counter Strike: Source
Физические законы
Эта часть кода регламентирует физические законы внутри игры. Например, как падает предмет с высоты на землю или как двигается стрела, выпущенная из лука (и куда она отлетает, в случае столкновения с твердым препятствием).
Физика не может быть одинаковой для каждого объекта
Внутриигровой баланс
Этот код будет задавать плюсы и минусы определенного компонента. К балансу можно отнести, например, сложность прохождения уровня: она, в свою очередь, состоит из множества мелких факторов, например, стамины противников, силы оружия игрока, времени на прохождение и так далее.
Без баланса геймплей просто развалиться
Графическая оболочка
Раньше персонажи и объекты просто оборачивались в двухмерные текстуры. Сейчас — всё стало гораздо сложнее: используются многопоточные рендеры, biped-анимация, реалистичные модели теней и многое другое.
Графика, все еще, отличима от реального мира, но в некоторых случаях — она максимально приближена к нему
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Этапы создания
Этапов создания, конечно, гораздо больше, чем три. Но мы рассмотрим основные стадии разработки.
Pre-Production
На пре-продакшене решается множество вопросов:
- О чем будет игра.
- На какую аудиторию она рассчитана.
- На какой рынок она нацелена.
- Какие игры будут конкурентами.
- Где и когда она будет опубликована.
- Как будет продаваться.
- Сколько времени потребуется на разработку.
- Какие ресурсы и какой бюджет потребуются для производства.
Из всех этапов разработки, пре-продакшн является наиболее изменчивым, занимая от нескольких недель до нескольких месяцев (а иногда — около года и даже дольше), в зависимости от масштаба проекта.
В идеале предпроизводство, обычно, занимает около 20% времени, отведенного на все этапы процесса разработки продукта.
Производство
Это самый длительный этап работы над проектом и самый напряженный. Производство крупной игры может занимать несколько лет. Кстати, на этом этапе также происходит доработка всех аспектов, начиная с сюжета и персонажей и заканчивая окружением и ресурсами.
Пост-продакшн
Существует распространенное заблуждение: после завершения разработки игры процесс производства останавливается. На самом деле, после того как игра отправлена в пост-продакшн, работа может стать еще более интенсивной. В крупных студиях отделы перераспределяются на техническое обслуживание, исправление ошибок и разработку патчей для улучшения игры. QA находит 90% ошибок, которые разработчики должны устранить, но все баги поймать невозможно. И здесь на помощь приходят первые игроки — они всегда найдут дополнительные ошибки.
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Первый проект — с чего начать
Прежде всего — необходимо определиться с платформой для которой будет создаваться игра. Это может быть десктоп, браузер, мобильное устройство, консоль. От платформы вы и будете отталкиваться при выборе конкретных инструментов и технологий для разработки.
Сегодня вы можете найти огромное количество обучающих материалов, включая учебники, коллекции шаблонов, готовых программных инструментов для создания игр. И тем не менее, создание игр — одна из самых сложных задач как для начинающего, так и опытного разработчика.
Создать игру — это как построить дом (начиная с фундамента и заканчивая чистовой отделкой внутри). И ни один разработчик не способен в одиночку создать тайтл уровня Far Cry 5, например. Для создания игры такого масштаба необходимо сразу несколько специалистов: гейм-дизайнер, тестировщик, художник, композитор, звукорежиссёр, программист, дизайнер уровня, дизайнер баланса, сценарист, продюсер, переводчик, аниматор. В одиночку программист может создать инди-тайтл, но не коммерчески успешный тайтл уровня GTA VI.
Таким образом, начать разработку нужно с выбора платформы и формирования концепции будущей игры (жанр, тематика, сеттинг, целевая аудитория, определение, краткое описание).
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Что посмотреть: видеоуроки, каналы ютуб
Наконец — несколько видео, которые помогут сформировать правильное представление о том, как это: быть геймдевом и программировать в этой отрасли.
One Year of Game Development with Unreal Engine: My Journey. Одиночный независимый разработчик, пытается делать игры. Самоучка в области 3D-моделирования и разработки с базовыми знаниями Java, полученными в университете, расскажет о своем опыте использования Unreal Engine 4 и 5, а также Unity.
ЧТО Я УЗНАЛ ЗА 9 ЛЕТ В ГЕЙМДЕВЕ | Game dev by Artalasky. Действующий геймдев делится своим опытом за 9 лет. Колоссальный багаж знаний, реальный опыт, неприятные ошибки, несколько инсайтов. Все это ждет вас в видео.
8 Months of Game Dev in 13 Minutes. Разработчик делится опытом создания игры в течение восьми месяцев за 13 минут. Концепция, сложности, движки, механика, и всё это — в одном видео.
IT профессии: РАЗРАБОТЧИК ИГР или GAME DEVELOPER. Как попасть в ГЕЙМДЕВ c нуля? Видео о профессии Game Developer. Всё, что нужно знать будущему разработчику в одном видео.
Game development is HARD. Gamedev — это всегда сложно. И в этом видео — вы узнаете, почему. Обязательно посмотрите, чтобы понять основные вызовы, с которыми сталкиваются game-разработчики.
Should You Be a Game Developer?
Если вы когда-нибудь задумывались о том, стоит ли становится Game Developer — это видео для вас. Разработчик с 20-летним стажем в играх расскажет о том, каково это на самом деле — быть геймдевом. Интересные подробности о Unity3D и Unreal. А также — плюсы и минусы профессии.
Коротко о главном
Ставить слишком большие задачи для своего первого проекта — типичная ошибка начинающих программистов. Начинайте с малого. Представьте свою будущую игру как долгосрочную цель, а не как краткосрочную. Вот подсказки, как добиться успеха:
- Тщательно документируйте дизайн в том виде, в котором вы видите его в данный момент. Не пытайтесь расширить его, просто зафиксируйте то, что у вас есть сейчас.
- Выберите инструмент и язык. Вариантов много, C++, Java, Unity, UE — лучшие из них.
- Изучите инструменты, движки и язык досконально. Сделайте несколько простых проектов с изучаемыми инструментами. Например, создайте локальную игру по типу танчиков для Dendy, а затем — расширьте ее до многопользовательской. После — придумайте еще более сложный вариант.
- После каждого небольшого подпроекта — пересматривайте свой проект и подумайте: чему вы научились и как это повлияло на ваш стек.
Остались вопросы?
Укажите ваши данные, и мы вам перезвоним
Один из популярных мотивов обучения программированию — желание написать собственную игру. В этой статье мы сравним несколько игровых движков на практике.
Чтобы извлечь пользу из этого руководства, нужно уметь программировать на Python, а также знать, как в языке реализуется объектно-ориентированное программирование. Для независимой установки движков мы советуем использовать виртуальные окружения.
Игровые движки для Python обычно являются библиотеками, которые можно установить с помощью менеджера pip
или загрузить с площадок распространения кода. В противовес к библиотекам существуют автономные среды, предназначенные исключительно для написания игр:
- Unreal Engine
- Unity
- Godot
Такие программы отличаются от игровых движков Python во многих аспектах:
- Поддерживаемые языки. Среды программирования игр обычно написаны на C-подобных языках и предлагают использовать соответствующие языки для написания игр: в Unity это C#, в Unreal Engine — C++.
- Поддержка платформ. Автономные среды позволяют без дополнительных усилий создавать игры для различных платформ, включая мобильные устройства. Напротив, перенос Python-игры на мобильные устройства — задача не из лёгких.
- Лицензирование. Игры, написанные с использованием автономного игрового движка, имеют особые условия лицензирования и дальнейшего распространения.
Зачем же вообще использовать Python для написания игр? Использование GameDev-сред требует изучения документации и обычно — овладения новым языком программирования. В то же время при работе с игровыми движками на Python питонисты применяют в основном уже имеющиеся знания. Это помогает быстрее двигаться вперед и получить первый результат.
Критерии отбора Python-движков в этой статье:
- популярность,
- актуальная поддержка,
- качественная документация.
Для каждого движка мы рассмотрим способ установки, базовую терминологию и основные возможности для реализации игр.
Pygame
Pygame — первое, что приходит на ум, когда кто-нибудь начинает разговор об играх на Python.
Pygame расширяет собой библиотеку SDL (сокр. от Simple DirectMedia Layer), предназначенную для межплатформенного доступа к мультимедийным аппаратным компонентам системы: мыши, клавиатуре, джойстику, аудио- и видеоустройствам.
Pygame определяет множество классов, которые инкапсулируют концепции, не зависящие от аппаратного обеспечения. В результате игры и мультимедийные программы запускаются в любых системах, где можно установить библиотеку.
Установка Pygame
После создания и активации виртуального окружения установите библиотеку с помощью pip :
(venv) $ python -m pip install pygame
Чтобы проверить результат установки, запустите пример, поставляемый вместе с библиотекой:
(venv) $ python -m pygame.examples.aliens
При возникновении трудностей в процессе установки, обратитесь к руководству по началу работы, в котором описаны известные проблемы и возможные решения.
Базовые концепции Pygame
Game loop. Для управления ходом игры используется понятие игрового цикла. Функциональность игрового цикла реализует автор, а Pygame предоставляет необходимые методы и функции. Каждая итерация игрового цикла называется кадром (frame
). За один кадр игра выполняет четыре действия:
- Обработка пользовательского ввода от мыши, клавиатуры или джойстика с помощью модели событий.
- Обновление состояния игровых объектов: спрайтов (образы героев и предметов), изображений, шрифтов и цветов. Объекты описываются подходящими структурами данных или с помощью классов Pygame.
- Обновление дисплея и аудиовыхода. Pygame обеспечивает абстрактный доступ к оборудованию для отображения картинки и передачи звука с помощью внутренних модулей
display
,mixer
иmusic
. - Сохранение или изменение скорости игры. Модуль
pygame.time
позволяет авторам игр контролировать скорость игры. За счёт этого игра работает с одинаковой скоростью на различном оборудовании — библиотека гарантирует завершение каждого кадра в течение заданного периода времени.
Базовый пример Pygame
В трех следующих движках мы будем начинать рассмотрение с базового примера, в котором движок рисует на на экране пару фигур и выводит текст.
# Импортируем и инициализируем библиотеку
import pygame
pygame.init()
# Устанавливаем ширину и высоту окна в пикселях
WIDTH = 800
HEIGHT = 600
# Настраиваем окно отрисовки
screen = pygame.display.set_mode([WIDTH, HEIGHT])
# Игровой цикл выполняется, пока пользователь не захочет выйти
running = True
while running:
# Нажал ли пользователь кнопку зыкрытия окна?
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Заполняем фон белым цветом
screen.fill((255, 255, 255))
# Рисуем синий круг в центре экрана радиусом 50
pygame.draw.circle(screen, (0, 0, 255), (WIDTH // 2, HEIGHT // 2), 50)
# Рисуем красный контурный квадрат в верхнем левом углу экрана
red_square = pygame.Rect((50, 50), (100, 100))
pygame.draw.rect(screen, (200, 0, 0), red_square, 1)
# Рисуем оранжевый текст с кеглем 60
text_font = pygame.font.SysFont("any_font", 60)
text_block = text_font.render(
"Hello, World! From Pygame", False, (200, 100, 0)
)
screen.blit(text_block, (50, HEIGHT - 50))
# Обновляем экран
pygame.display.flip()
# Цикл завершился! Уходим.
pygame.quit()
Для запуска кода используйте команду:
(venv) $ python pygame/pygame_basic.py
Игровой цикл есть даже в такой скромной программе. В примере он управляется переменной running
. Её установка в значение False
завершает выполнение программы.
Обработка событий. События хранятся в виде очереди, из неё события извлекаются с помощью pygame.event.get()
. В рассматриваемом случае обрабатывается только событие pygame.QUIT
, генерируемое при закрытии пользователем окна программы. При обработке этого события мы устанавливаем running = False
.
Отрисовка фигур и текста. В то время как для отрисовки фигур просто используются специальные методы, отрисовка текста выглядит несколько сложнее. Сначала выбираем шрифт и создаем объект шрифта. Далее вызываем метод .render()
и передаем ему текст, шрифт и цвет. В ответ метод создает объект класса Surface
. Этот объект мы копируем на экран screen
, используя его метод screen.blit()
.
В конце игрового цикла мы даем команду отобразить на дисплее все, что было ранее нарисовано.
Продвинутый вариант игры на Pygame
Чтобы лучше изучить возможности Pygame, напишем настоящую игру.
Геймплей. Главный герой представлен одиночным спрайтом, управляемым перемещением мыши. Через равные промежутки времени на экране одна за другой появляются монеты. Когда персонаж перемещается поверх монеты или сталкивается с ней, монета исчезает, а игрок получает 10 очков. По ходу игры монеты начинают добавляться быстрее. Игра заканчивается, когда на экране присутствует более десяти монет или игрок закрыл окно.
# Импорт и инициализация
import pygame
# Для случайного размещения монет
from random import randint
# Для поиска ресурсов
from pathlib import Path
# Для аннотации типов
from typing import Tuple
# Устанавливаем размеры окна
WIDTH = 800
HEIGHT = 600
# Как часто должны генерироваться монеты (мс)
coin_countdown = 2500
coin_interval = 100
# Сколько монет должно быть на экране, чтобы игра закончилась
COIN_COUNT = 10
# Определяем спрайт для игрока
class Player(pygame.sprite.Sprite):
def __init__(self):
"""Инициализирует спрайт игрока"""
super(Player, self).__init__()
# Получаем изображение персонажа
player_image = str(
Path.cwd() / "pygame" / "images" / "alien_green_stand.png"
)
# Загружаем изображение, настраиваем альфа канал для прозрачности
self.surf = pygame.image.load(player_image).convert_alpha()
# Сохраняем в прямоугольнике, чтобы перемещать объект
self.rect = self.surf.get_rect()
def update(self, pos: Tuple):
"""Обновляет позицию персонажа
Аргументы:
pos {Tuple} -- (X,Y) позиция для движения персонажа
"""
self.rect.center = pos
# Определяем спрайт для монет
class Coin(pygame.sprite.Sprite):
def __init__(self):
"""Инициализирует спрайт монеты"""
super(Coin, self).__init__()
# Получаем изображение монеты
coin_image = str(Path.cwd() / "pygame" / "images" / "coin_gold.png")
# Загружаем изображение, настраиваем альфа канал для прозрачности
self.surf = pygame.image.load(coin_image).convert_alpha()
# Задаем стартовую позицию, сгенерированную случайным образом
self.rect = self.surf.get_rect(
center=(
randint(10, WIDTH - 10),
randint(10, HEIGHT - 10),
)
)
# Инициализируем движок
pygame.init()
# Настраиваем окно
screen = pygame.display.set_mode(size=[WIDTH, HEIGHT])
# Скрываем курсор мыши
pygame.mouse.set_visible(False)
# Запускаем часы для фиксации времени фрейма
clock = pygame.time.Clock()
# Создаем событие для добавления монеты
ADDCOIN = pygame.USEREVENT + 1
pygame.time.set_timer(ADDCOIN, coin_countdown)
# Настраиваем список монет
coin_list = pygame.sprite.Group()
# Инициализируем счет
score = 0
# Определяем звук для столкновения с монетой
coin_pickup_sound = pygame.mixer.Sound(
str(Path.cwd() / "pygame" / "sounds" / "coin_pickup.wav")
)
# Создаем спрайт героя и устанавливаем на заданную позицию
player = Player()
player.update(pygame.mouse.get_pos())
# Цикл событий
running = True
while running:
# Проверяем, нажал ли пользователь кнопку закрытия окна
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Определяем, нужно ли добавлять новую монету
elif event.type == ADDCOIN:
# Добавляем новую монету
new_coin = Coin()
coin_list.add(new_coin)
# Ускоряем игру, если на экранее менее 3 монет
if len(coin_list) < 3:
coin_countdown -= coin_interval
# Ограничиваем скорость
if coin_countdown < 100:
coin_countdown = 100
# Останавливаем предыдущий таймер
pygame.time.set_timer(ADDCOIN, 0)
# Запускаем новый таймер
pygame.time.set_timer(ADDCOIN, coin_countdown)
# Обновляем позицию персонажа
player.update(pygame.mouse.get_pos())
# Проверяем, столкнулся ли игрок с монетой и удаляем, если это так
coins_collected = pygame.sprite.spritecollide(
sprite=player, group=coin_list, dokill=True
)
for coin in coins_collected:
# Каждая монета стоит 10 очков
score += 10
# Воспроизводим звук для монеты
coin_pickup_sound.play()
# Проверяем, не слишком ли много монет
if len(coin_list) >= COIN_COUNT:
# Если монет много, останавливаем игру
running = False
# Указываем цвет фона
screen.fill((255, 170, 164))
# Рисуем следующие монеты
for coin in coin_list:
screen.blit(coin.surf, coin.rect)
# Отрисовываем персонажа
screen.blit(player.surf, player.rect)
# Выводим текущий счет
score_font = pygame.font.SysFont("any_font", 36)
score_block = score_font.render(f"Score: {score}", False, (0, 0, 0))
screen.blit(score_block, (50, HEIGHT - 50))
# Отображаем всё на экране
pygame.display.flip()
# Скорость обновления - 30 кадров в секунду
clock.tick(30)
# Готово! Печатаем итоговый результат
print(f"Game over! Final score: {score}")
# Делаем курсор мыши вновь видимым
pygame.mouse.set_visible(True)
# Выходим из игры
pygame.quit()
Спрайты в Pygame предоставляют лишь базовую функциональность — в нашем коде мы их расширяем, создавая подклассы для персонажа (Player
) и монет (Coin
). Объекты спрайтов сохраняются в self.surf
и позиционируются с помощью свойства self.rect
.
Вывод монет. Чтобы добавлять монеты на экран через равные промежутки времени, мы используем таймер time.set_timer()
, отсчитывающий время до события в миллисекундах (coin_countdown
). Добавлению монет соответствует событие ADDCOIN
. Событие создает новый объект Coin
и добавляет его в coin_list
. Далее проверяется количество монет на экране. Если монет меньше трех, то coin_countdown
уменьшается. Предыдущий таймер останавливается и запускается новый.
Движение персонажа. При движении игрок сталкивается с монетами и собирает их. При этом мы удаляем соответствующий объект из coin_list
, обновляем счёт и воспроизводим звук. Автор игры также должен помнить об очистке экрана, отрисовке спрайтов в правильном порядке и отображении счёта.
Заключение по Pygame
Pygame — мощная и хорошо зарекомендовавшая себя библиотека, но у неё есть недостатки. Автор игры должен самостоятельно оформить базовое поведение спрайтов, реализовать игровые циклы и основные обработчики событий. Как вы увидите далее, более современные игровые движки позволяют достичь аналогичных результатов при меньшем объёме выполняемой работы.
Pygame Zero
С одним задачами Pygame справляется хорошо, в других — сказывается возраст библиотеки. Для новичков в написании игр есть вариант получше — Pygame Zero. Эта библиотека разработана для образовательных задач, поэтому текст документации будет понятен даже для новичков в программировании. Кроме того, есть подробное пошаговое руководство.
Установка Pygame Zero
Pygame Zero можно установить, как и любую другую библиотеку Python:
(venv) $ python -m pip install pgzero
Базовый пример на Pygame Zero
Pygame Zero автоматизирует многие вещи, которые программистам приходится описывать вручную при использовании стандартного движка Pygame. По умолчанию Pygame Zero предоставляет создателю игры:
- игровой цикл — его не нужно писать;
- модель событий для отрисовки, обновлений и обработки ввода;
- единую обработку изображений, текста и звука;
- класс спрайтов и методы анимации для пользовательских спрайтов.
В результате код базовой программы Pygame Zero оказывается более кратким, чем на Pygame.
💡 Чтобы не «раздувать» текст статьи, мы отсылаем читателей посмотреть этот и следующие примеры кода мы в упомянутому выше репозиторию.
Отрисовка окна. Pygame Zero автоматически распознает, что константы WIDTH
и HEIGHT
относятся к размеру окна. Pygame Zero также предоставляет базовый код для закрытия окна, так что закрытие окна не нужно описывать в обработчике.
Отрисовка фигур и текста. Поскольку Pygame Zero основан на Pygame, он наследует часть кода для отрисовки фигур, но вывод текста выглядит проще и занимает один вызов вместо трех для обычного Pygame.
screen.draw.text(
f"Score: {score}",
(50, HEIGHT - 50),
fontsize=48,
color="black",
)
Запуск программ Pygame Zero осуществляется из командной строки с помощью команды:
(venv) $ python pygame_zero/pygame_zero_basic.py
Продвинутый вариант игры на Pygame Zero
Чтобы продемонстрировать разницу между игровыми движками, мы вернемся к той же игре, что описали для Pygame. Игра ведет себя идентично версии, продемонстрированной ранее. Программный код игры также доступен в репозитории.
Спрайты в Pygame Zero называются Actors
. Их характеристики требуют некоторых пояснений, так как эти сведения используются в коде примера:
- Для каждого
Actor
задаются, как минимум, изображение и положение. - Все изображения должны располагаться во вложенной папке с именем
./images/
. Названия файлов должны содержать лишь строчные буквы, цифры или символы подчеркивания. - При ссылке на изображение используется имя файла без расширения. Например, если изображение называется
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:
(venv) $ python -m pip install arcade
Есть также инструкции по установке для Windows, macOS и Linux. При желании можно собрать движок из исходного кода.
Базовый пример на Arcade
Начнем с базового примера с фигурами и текстом. Чтобы запустить код, используйте следующую команду:
(venv) $ python arcade/arcade_basic.py
Начало координат (0, 0)
расположено в левом нижнем углу экрана. Это отличает Arcade от большинства игровых движков, в которых начало координат расположено в левом верхнем углу.
Arcade — это объектно-ориентированная библиотека. Для подклассов игр используется класс arcade.Window
, для настройки игры вызывается super().__init()
.
Отрисовка всего что есть на экране производится обработчиком событий .on_draw()
. Обработчик стартует с вызова .start_render()
, который сообщает Arcade подготовить окно для рисования. Напоминает pygame.flip()
для отрисовки в Pygame.
Фигуры и цвета. Каждый из основных методов рисования фигур в Arcade начинается с draw_*
. Arcade умеет отрисовывать множество разнообразных фигур и сотни именованных цветов из пакета arcade.color. Также можно использовать кортежи RGB или RGBA.
Продвинутый вариант игры на Arcade
Чтобы показать, чем Arcade отличается от других игровых движков, запрограммируем ту же игру с монетами, что и раньше.
Инициализация. Объектно-ориентированный характер Arcade позволяет отделить инициализацию игры от инициализации отдельного уровня: игра инициализируется методом .__init__()
, а уровни настраиваются и перезапускаются с помощью .setup()
. Это отличный шаблон для использования даже в играх с одним уровнем, как в нашем случае.
Спрайты создаются в виде объекта класса arcade.Sprite
, которому задан путь к изображению — Arcade поддерживает pathlib
-пути.
Создание монет планируется с помощью arcade.schedule()
и вызова self.add_coin()
через равные промежутки времени. Метод .add_coin()
создает новый спрайт монеты в случайном месте и добавляет его в список.
Перемещение персонажа мышью реализуется с помощью метода .on_mouse_motion()
. Метод arcade.clamp()
гарантирует, что координаты центра страйпа не выйдут за пределы экрана.
Столкновение с монетой обрабатывается методом .on_update()
. Метод arcade.check_for_collision_with_list()
возвращает список всех спрайтов, которые столкнулись с указанным спрайтом. Код проходит по этому списку, увеличивает счет и воспроизводит звук. Метод .on_update()
проверяет, не слишком ли много монет сейчас есть на экране.
Заключение по Arcade
Реализация Arcade так же удобна для чтения и хорошо структурирована, как и код для Pygame Zero. Однако программный код занимает больше места — 194 строки. Причина в том, что в Arcade заложены возможности, которые лучше реализуются в более крупных играх:
- анимированные спрайты;
- встроенные физические движки;
- поддержка сторонних игровых карт;
- системы работы с частицами и шейдирование.
Авторы игр, пришедшие в Arcade из Pygame Zero обнаружат здесь знакомую структуру, но более мощные и продвинутые функции.
adventurelib
Мир игр полон самых различных жанров. Бывают и такие игры, как например, Zork, в которых основой игрового повествования является текст. Такой тип игр ещё называют Interactive Fiction. Для создания текстовых игр на Python существует движок adventurelib. Библиотека отлично подойдет для тех, кто хочет создать текстовую игру без необходимости писать парсер языка.
Установка adventurelib
adventurelib доступен на PyPI и может быть установлен с помощью соответствующей команды pip :
(venv) $ python -m pip install adventurelib
Библиотеку также можно установить из репозитория GitHub, сохранив в той же папке, что и ваша игра, и использовать напрямую.
Базовые концепции adventurelib
Чтобы изучить основы adventurelib, мы рассмотрим небольшую игру с тремя комнатами и ключом, открывающим дверь в последней комнате.
Чтобы запустить код из примера, используйте следующую команду:
(venv) $ python adventurelib/adventurelib_basic.py
Декоратор @when. Текстовые игры в значительной степени полагаются на синтаксический анализ пользовательского ввода. Библиотека определяет текст, который вводит игрок, как команду (command
) **и предоставляет для описания команд декоратор @when()
. Например, декоратор @when("look")
добавляет команду в список допустимых команд и связывает с ней функцией look()
. Всякий раз, когда игрок набирает look
, adventurelib вызывает соответствующую функцию. Для удобства игроков и разработчиков команды нечувствительны к регистру.
Несколько команд могут использовать одну и ту же функцию. Функция go()
декорирована девятью различными командами, чтобы игрок мог перемещаться по игровому миру. В скриншоте ниже есть три из них: south
, east
, north
.
Предметы. В текстовых играх часто есть предметы, которые необходимо собирать, чтобы открывать новые области игры или решать головоломки. Или это могут быть персонажи, с которыми игрок может взаимодействовать. Движок 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
собирает всё вместе, добавляет команды и запускает игру.
Игру можно запустить с помощью следующей команды:
(venv) $ python adventurelib/adventurelib_game.py
В предыстории мы наметили игровые области и пути, по которым может перемещаться игрок. Они показаны на блок-схеме ниже.
Каждая область имеет свои свойства:
- название, краткое и подробное описания;
- предметы и персонажи;
- заблокированные выходы;
- указание на то, был ли уже игрок в этой области или нет.
Используем ООП. Чтобы быть уверенными, что каждая область имеет собственный экземпляр каждого из этих свойств, мы создадим в файле у подкласс 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")
.
Позже при разговоре игрока с кузнецом добавляется второй уровень контекста, отражающий возможную покупку оружия. За счет этого программа понимает, что одна и ту же команда "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.
Базовые концепции Ren’Py
В той же программе можно начать новый проект, это создаст необходимую структуру файлов и папок. Хотя для запуска игр требуется Ren’Py Launcher, для редактирования кода можно использовать любой удобный редактор.
Сценарии игр Ren’Py хранятся в файлах с расширением .rpy
, написанных на специальном языке Ren’Py. Файлы хранятся в папке game/
внутри папки проекта.
Для нового проекта Ren’Py создаёт следующие сценарии, которые можно сразу же использовать и редактировать:
gui.rpy
определяет внешний вид всех элементов пользовательского интерфейса;options.rpy
определяет изменяемые параметры для настройки игры;screens.rpy
описывает стили диалогов, меню и других элементов вывода информации;script.rpy
— место, где вы начинаете писать игру.
Чтобы запустить примеры игры из материалов этого руководства, следуйте инструкции:
- Запустите Ren’Py Launcher.
- Нажмите
Preferences
, затемProjects Directory
. - Измените
Projects Directory
на папкуrenpy
из загруженного репозитория с примерами. - Нажмите
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
, вы встречаете приветствующего вас кузнеца:
Кузнец предлагает улучшить ваше оружие. Если вы решите это сделать, вы обновите значения для 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 идей для начинающих программистов по созданию игр-клонов
Что вы делаете, когда вы играете в какую-то игру и несколько раз не можете пройти одно и то же место? Можно просто найти уже готовое прохождение. Это, конечно, здорово, но что, если вы застряли в разработке игры? Какой гайд прочитать? Так пусть наша статья станет вашим пошаговым руководством к разработке вашей первой игры, если вы все еще не начали ее писать. Если уже начали, то вам все равно не помешает прочитать наши советы — быть может, увидите что-нибудь новое.
Прежде, чем мы начнем, мы хотим привести вам пример первой игры от автора этой статьи. Это была простая текстовая игра под названием Divine Blood:
Это была самая первая игра, причем запрограммированная для калькулятора TI-83 Plus. Позднее она была переписана автором на Java во время обучения в старших классах. Примечательно, что игра так и не была закончена.
Ко всеобщему сожалению, не доводить игры до логического конца — одна из самых распространенных проблем начинающих разработчиков. Соответственно, возникает вопрос: как повысить свою продуктивность и все-таки закончить начатый проект? Ответ прост: прочтите наше «прохождение» разработки игры.
Основные этапы
Если вы разрабатываете игру сами (а начинающие программисты обычно пишут как раз в одиночку), то процесс написания можно разделить на 4 основных этапа (или уровня, как и в играх):
- планирование;
- прототипирование;
- программирование;
- релиз.
Каждый следующий уровень в видеоигре сложнее, чем предыдущий. Здесь все также: каждый следующий этап имеет свои трудности и проблемы, с которыми вы неизбежно встретитесь. Это пошаговое руководство поможет вам не остановиться ни на одном этапе разработки игры. Мы приведем различные цитаты и мнения профессионалов, целиком прошедшие тот путь, который мы только начинаем.
В играх каждый уровень имеет свои проблемные места, а в конце — еще и босса. Так будет и у нас. Мы остановимся на них более подробно и, как и в любом прохождении, мы покажем, как пройти эти места и двинуться дальше.
Уровень 1: Планирование
Помните, сделав 90% игры, вы думаете, что потратили 90% своего времени. А доделывая оставшиеся 10%, вы тратите еще столько же «оставшегося» 90% времени. Составляйте план, учитывая это. — Ян Шрейбер
Первый и одновременно самый важный уровень разработки — планирование. На этом этапе вы должны спланировать всю свою деятельность и учесть все аспекты вашей игры. Цель этого уровня — обдумать все настолько тщательно, чтобы на остальных этапах вам не пришлось импровизировать.
Как только вы задумали что-то разработать, первым делом достаньте блокнотик, ручку и начинайте писать свои идеи. Максимально подробно останавливайтесь на деталях, это поможет вам в будущем. Пишите все, что вы хотели бы увидеть в вашей игре. Вся соль здесь заключается в том, что поначалу это сделать довольно просто: проект пока не разрос, и все у вас находится на виду. Но чем больше вы разрабатываете игру, тем сложнее будет начать писать свои идеи и в дальнейшем учитывать их.
Как уже говорилось выше — уделяйте внимание деталям. Записали новую фичу для реализации? Отметьте рядом, как она будет работать, как будет влиять на игрока и непосредственно на игровой процесс. И помните, секрет успешной разработки — решать существующие проблемы, пока они не накопились.
Разработка игры есть компромисс. Качественная игра должна уметь делать не все подряд, а только ограниченный набор хорошо работающих функций. — Патрик Вайет
Именно поэтому важно спланировать все, иначе на этапе разработки (уровень 3) вы захотите добавить в игру больше возможностей и начнете реализовывать все подряд, что категорически неправильно. Ваш проект рискует быть чрезмерно большим, отчего вам сложнее будет его контролировать, а вскоре вы вовсе бросите его в дальний ящик в надежде, что возьметесь за него позже. Если вы играли в серию игр Halo, представьте себе, как было бы трудно играть в нее, если бы вы столкнулись с парочкой охотников сразу после начала игры. Вы попросту будете умирать снова и снова, пока вам не надоест эта череда смертей. В разработке игры все аналогично.
Основная проблема первого этапа — притупить свое желание кодить и начать планировать. Написать код вы всегда сможете, для этого у вас будет целый этап. Спланируйте как можно больше аспектов вашей игры.
А боссом этого уровня являются вопросы. Просмотрите на все свои заметки и убедитесь в том, что у вас нет каких-либо непонятных пунктов: ни в используемых инструментах, ни в алгоритмах и прочем. Если же у вас действительно все вопросы решены, то вы смело можете считать, что уровень «Планирование» закончен. Но если остались непонятные аспекты — решите их, прежде чем переходить дальше.
Разумеется, у вас могут возникнуть такие вопросы, которые касаются, например, баланса игры. В таких случаях вы также готовы переходить дальше, поскольку эту проблему необходимо будет решить на втором и третьем этапах разработки игры.
Уровень 2: Прототипирование
Дизайн это процесс, а не результат. — Кристофер Симмонс
Вторым уровнем нашей игры-разработки является прототипирование. Здесь вы должны проверить и протестировать основную механику и особенности вашей игры. Выше мы говорили о том, что на предыдущем этапе могут возникнуть вопросы по поводу баланса. Второй уровень как раз и нужен для того, чтобы отшлифовать этот параметр.
На этом этапе вы будете писать код не очень красивый и не совсем правильный. Это в порядке вещей, поскольку вы пишете прототип. Когда вы перейдете дальше, вы уже будете знать, что и где работает не так, как должно.
Если вы получаете удовольствие от какой-либо игры, то вы захотите поиграть в нее снова, независимо от того, сколько очков или денег вы там набрали. — Стэн Яроцки
Несмотря на то, что данный этап мы выделили отдельно, в некоторых случаях его можно пропустить, поскольку он имеет очень много общего с планированием. Вы можете подумать, что мы не постоянны в своих суждениях: совсем недавно призывали вас не переходить на следующий уровень, пока не пройден текущий, а сейчас говорим, что этап прототипирования можно пропустить.
Вы помните секретные телепорты в игре Super Mario Bros? Игрок мог найти хорошо спрятанные трубы, прыгнув в которые можно было пропустить несколько уровней. Так и здесь. Правда, мы не полностью пропускаем прототипирование, а совмещаем его с планированием.
Хотим заметить, что первые два этапа взаимозаменяемы. Быть может, вы хотите проверить основную механику вашей игры, прежде чем потратите кучу времени на детали? А может, вы хотите попробовать какую-то возможность в вашей игре? Это основные причины, почему есть смысл в том, чтобы поменять порядок первых двух этапов.
Хорошая игра — это поток интересных задач, решаемых игроком. — Брюс Шелли
На этом этапе у вас могут возникнуть две главные сложности. Первая — желание наконец перейти на следующий этап и начать писать код. Как мы уже говорили выше, вы должны быть максимально готовы к переходу на следующий уровень, а потому — не спешите. Второй сложностью является желание создать более точный и законченный прототип. Этого делать уж точно не стоит, поскольку прототип по определению не должен быть законченным продуктом.
А боссом этого уровня является полнота. Вы должны собрать воедино все наработки первого и второго этапа и понять, что же у вас должно получиться в итоге. Если вы будете иметь хорошее представление о вашем конечном проекте, то проблем при написании кода у вас точно не возникнет. А следовательно, повысятся шансы закончить игру.
Уровень 3: Программирование
Третий уровень — наиболее сложный уровень для начинающих программистов. Дойдя до него, многие забрасывают свой проект. Но бояться здесь ничего не надо! Первые два этапа пройдены и вы уже на полпути к окончанию разработки.
Чтобы начать этот этап, вам стоит определиться с целевой платформой вашей игры. Будет эта игра для консолей, а, может быть, мобильная или вовсе браузерная? Определившись с платформой, выберите необходимый инструментарий и язык программирования.
На самом деле эти два шага можно выполнить в обратном порядке. Имея какую-либо среду разработки (или язык программирования), вы можете проанализировать ее возможности и решить, что вы сможете написать.
Вы очень сильно облегчите себе жизнь, если воспользуетесь бесплатными библиотеками и ресурсами. Не пытайтесь изобретать велосипед: используйте то, что находится в свободном доступе. Это поможет вам приберечь немного сил для того, чтобы закончить проект.
«Я не умею рисовать» — используй клипарт. «Я не умею создавать звуки» — ищи MIDI файлы. «Я не умею программировать» — никого это не волнует, не программируй! — Роб
Основными неприятными моментами на этом этапе выступают появляющиеся проблемы и разочарование. Вы неоднократно будете натыкаться на моменты, когда не будете знать, как решить текущую задачу. Более того, вполне возможно, что ваша игра на какой-то стадии разработки не оправдает ваших надежд.
Но вы не должны унывать! Лучшее решение этих проблем — отвлечься от проекта на несколько дней. Вы очистите ваш ум и позволите новым идеям посетить его. Также неоднократно замечено, что «утро вечера мудренее». Застряли? Не знаете как решить проблему? Ложитесь спать, а на завтрашнее утро вы, возможно, сразу поймете причину ваших неудач. Не работайте до изнеможения и не изнуряйте себя: работа над проектом должна быть в удовольствие.
Если вы пытаетесь и не можете решить действительно сложную проблему — остановитесь. Решите более простую проблему, которая выполняет те же действия, что и сложная. — Даниель Кук
Ну а боссом этого уровня является сама игра. Да, игра, которую вы и пишете. Она не должна быть идеальной, но она должна быть полноценной. Такой, в которую бы люди могли и хотели играть.
Уровень 4: Релиз
Никогда не сдавайся. — Элис Тейлор
Наконец-то мы добрались и до релиза. Конечно же, этот уровень не такой сложный, как предыдущий, но и легкомысленно относится к нему не стоит. На этом этапе вы должны убедить людей играть в вашу игру и давать вам обратную связь (вы же хотите улучшить свой проект?). Основываясь на отзывах игроков, внесите в ваше приложение те изменения, которые сделают игру более увлекательной по вашему мнению.
Главная проблема этого этапа — критика. Всегда найдутся те, кому попросту не понравится ваша игра. Это нормально. Не стоить из-за таких людей опускать руки. Ориентируйтесь лучше на тех, кто играет в ваше приложение и предлагает вам добавить в нее новые возможности.
Начиная создавать игру, не смотрите на результаты других. Создайте то, что хотите вы. — Роб
А финальным боссом всего нашего путешествия будет являться ваша гордость. Вы сделали полноценную игру от начала и до конца! На самом деле, не все могут похвастаться этим.
Каждый разработчик когда-нибудь напишет «плохую» игру. Если вы еще не написали — напишете. Все мы напишем. — Бренда Ромеро
И помните, дорога к успеху вымощена многократными неудачами. Никогда не сдавайтесь!
Вывод
Разработка первой игры — захватывающее занятие, выполняя которое мы получаем бесценный опыт. И все же, многие разработчики не могут довести свой проект до конца, хотя так категорически нельзя поступать. Следуя нашим четырем «уровням» разработки игры, вы увеличите свои шансы довести ваш проект до логического завершения.
А теперь соберитесь и напишите свою игру!
Перевод статьи «Making Your First Game: A Walkthrough for Game Developers»