VIA PEXELS/DARLENE ALDERSON

Программирование игр 101*

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

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

*101 - это условное обозначение вводных курсов для тех, кто хочет получить первое представление о предмете.

Что такое программирование игр?

Программирование игр можно определить как искусство и науку написания программного кода для игр. Это достаточно сложная задача, которая включает в себя множество аспектов необходимых для воплощения игры в жизнь. В игровом программировании понятия написания кода (coding), графического оформления (art), звукового оформления (sound), игровых механик (gameplay) и пользовательских интерфейсов (UI)* объединяются в единое целое, в то что в итоге люди увидят в игре. Во время разработки вы, скорее всего, будете тесно сотрудничать со всеми членами команды различных сфер деятельности - с художниками, дизайнерами и звукорежиссерами. Но если вы работаете в одиночку над проектом, то вам придется работать над всеми этими аспектами самостоятельно.

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

Основные понятия в игровом программировании

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

Игровой цикл (Game Loop)

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

Игровые состояния (Game States)*

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

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

Обработка ввода (Input Handling)

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

Обнаружение столкновений (Collision Detection)

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

Векторы (Vectors)

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

Физика (Physics)

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

Искусственный интеллект (Artificial Intelligence (AI))

Искусственный интеллект (ИИ) в играх, конечно, не так сложен как Генеративный ИИ*, который чаще всего понимают под термином ИИ. Однако, он является неотъемлемым компонентом интерактивности и фана в игре. Даже в простых играх (например, в одной из самых первых созданных игр - в Pong) есть простой вариант ИИ. Он позволяет сделать поведение неигровых персонажей реалистичнее или сложнее. И может варьироваться от простого движения (например, ракетка второго игрока в Pong, управляемая ИИ) до сложных процессов принятия решений, как в стратегических играх (например, в Stellaris, Total War, Civilization и т.д).

*Генеративный ИИ - тип ИИ, способный генерировать текст, изображения или другие данные в ответ на вопрос.

Инструменты и Игровые движки

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

Unity

Unity - кроссплатформенный игровой движок, который используется как независимыми разработчиками, так и AAA студиями*. Он поддерживает ПК, мобильные устройства, консоли и платформы виртуальной реальности. Является основой разработки приложений для iOS и Android, и на нем могут быть созданы как 2D, так и 3D игры.

Unity преимущественно использует C# в качестве языка программирования, но также поддерживает C/C++, Rust, IronPython, Lua, и Java.

На сайте Unity бесплатно доступно более 750 часов уроков. На сайте GameDeveloper.com вы можете найти полный вводный курс в Unity, начиная с установки и заканчивая знакомством с интерфейсом и настройками.

*AAA - класс высокобюджетных видеоигр.

Unreal Engine

Unreal Engine - кроссплатформенный игровой движок, который широко используется разработчиками в крупных компаниях. Unreal поддерживает ПК, мобильные устройства, консоли и платформы виртуальной реальности. Для него доступен исходный код с лицензионной моделью распространения для коммерческого использования. Чаще всего его используют для разработки 3D игр.

Unreal использует язык программирования C++. Его последняя версия Unreal Engine 5 поддерживает “блупринты” ("Blueprints”) - систему визуального программирования, позволяющую разработчикам создавать игровые скрипты без единой строчки кода.

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

Godot

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

В Godot можно пользоваться C# и C++, но рекомендуется использовать GDScript - встроенный Godot язык программирования, который является объектно-ориентированным, императивным языком с последовательной типизацией и с синтаксисом, похожим на язык Python.

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

Языки программирования для разработки игр

Как уже упоминалось, существует несколько языков программирования, которые обычно используются для разработки игр, но при наличии желания и достаточного опыта можно использовать практически любой язык программирования для создания игр. Однако, большая часть игр разрабатывается на движках, поддерживающих определенные языки, так что, если вы намерены заниматься разработкой игр, вам, вероятно, следует начать с C# и/или C++. Оба языка основаны на C, который является низкоуровневым языком программирования общего назначения, появившимся в 1972 году. C# и C++ - это расширения языка C и отличаются от него тем, что они являются высокоуровневыми языками с поддержкой парадигмы объектно-ориентированного программирования (ООП). ООП распространено в игровой разработке, и его следует изучить, если вы планируете расширять свои знания в этой области. 

C++

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

C#

C# - это тоже высокоуровневый язык программирования общего назначения. Он был разработан компанией Microsoft и выпущен вместе с .NET framework и Visual Studio. C# обычно считают более простым в изучении и использовании, чем C++, и он широко используется в движке Unity для разработки игр. Наряду с собственными уроками по C# от Microsoft, существует множество ресурсов для изучения C# конкретно в программировании игр.

Учебные ресурсы и сообщества

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

Ресурсы для начинающих программистов

Гарвардские CS50 курсы

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

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

CS50G, который также доступен бесплатно, продолжает курс CS50x и фокусируется на том, как разрабатывать 2D и 3D игры. Этот курс предназначен для изучения таких языков программирования, как Lua и C# и является хорошей отправной точкой для понимания концепций игровой разработки.

OSSU

Open-Source Society University (OSSU) предлагает возможности для самостоятельного изучения информатики совершенно бесплатно. OSSU - это полноценная учебная программа по информатике с использованием различных онлайн-материалов. Она стартует с начального, но также предоставляет возможность для того, чтобы перескочить на более высокий уровень, и нацелена на подготовку студентов, имеющих “всестороннее представление о концепциях, фундаментальных для всех компьютерных дисциплин”.

Roadmap.sh

Roadmap.sh - это коллекция роадмапов* сообщества, которые помогут разработчикам достичь целей в программировании. В разделе "Разработка Игр" вы можете получить четкое представление обо всех концепциях, инструментах и языках, имеющих отношение к программированию игр, а также дополнительную информацию и ресурсы для продолжения обучения.

*роадмап - это сленговое выражение для “дорожных карт” (roadmap), т.е. визуализированного последовательного плана с его целями и задачами, сроками и т.д.

Ресурсы для более опытных программистов

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

Udemy

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

Coursera

Coursera похож на Udemy и предлагает множество курсов по геймдизайну, программированию и игровым движкам.

Другие ресурсы

Помимо собственно курсов, существует также множество других ресурсов. Такие веб-сайты, как Stack Overflow, существуют для того, чтобы предоставить программистам пространство, в котором они могут обсудить свой код, задать вопросы о парадигмах и т.д. Форумы по Unity и Unreal Engine являются отличным местом, чтобы задать вопросы об этих движках, а также о языках программирования, которые они используют. Как и во всем остальном программировании, игровая разработка объединяет людей и основана на сотрудничестве, поэтому вы с легкостью найдете в интернете тех, кто готов вам помочь, если вы их об этом попросите.

Вывод

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