Теперь, когда мой рогалик, написанный на Dart, имеет открытый исходный код, мне хотелось бы поговорить о том, на что было потрачено большое количество времени. На самом деле я вложил даже слишком много усилий в некоторые элементы этой игры и может когда-нибудь напишу и о них. Однако сейчас я хотел бы начать с того места, где стартует любая игра: главный цикл.
Разработка игр *
Разработка игр
Как начать карьеру в игровой индустрии. Обзор профессий, обучение, полезные ресурсы
Первая компьютерная игра Spacewar! появилась в 1962 году. Наверняка ее создатель Стив Рассел даже не представлял, что его разработка положит начало развитию одного из самых прибыльных секторов экономики.
По данным исследования аналитической компании Ampere Analysis, в 2021 году на покупку игр, контроллеров и оформление подписок в общей сложности было потрачено 191 млрд долларов. В 2022 году этот показатель немного снизился и составил 188 млрд долларов. Но, согласно прогнозам, уже к 2023 году индустрия восстановится.
Эволюция игрового фреймворка. Клиент 1. Логика отображения
Всякая игра — это прежде всего то, что пользователь видит на экране и с чем он взаимодействует посредством устройств ввода (мышь, клавиатура, джойстик). То есть игра — это в первую очередь отображение. Простая игра так может и остаться отображением навсегда. В более сложной — приходится выделять также менеджеры, модели, сервисы, контроллеры. Но об этом в потом. Тут же мы начнем с графики и ее непосредственным управлением.
Метод нашей разработки прост. С одной стороны, чтобы избегать дублирования, мы будем выносить блоки кода сначала в цикл или функцию, потом в класс, а затем и в библиотеку. (И так до тех пор, пока у нас не появится фреймворк.) С другой стороны, мы будем ограничивать себя, создавая только тот код, который нужен именно сейчас, не фантазируя наперед о том, что может или не может понадобиться в будущем. Вот простая пара принципов: избегать дублирования и при этом не усложнять сверх необходимого.
Все примеры реализованы на Haxe + OpenFL), но код должен быть понятен всем, кто знаком с семейством языков ECMAScript. Главное же тут не код, а те идеи, которые за ним лежат.
Браузерная игра про пиратов
«Йо-хо-хо!» - невольно приходит на ум при любом взаимодействии с морем, передвигаешься ли на речном трамвайчике или же сидишь в баре круизного корабля. В последнем случае еще можно приобрести бутылку рому. Море привлекает своими волнами, закатами и рассветами. А особенно прикольно, когда на море завелись злые пираты. Ну... если это мы, конечно же.
Возьмем шейдер неба и шейдер воды - атмосфера готова! Что может быть проще. И да, я буду писать игру под браузер на Javascript с использованием библиотек Three.js и Cannon.js. Первую я использую для отображения 3D графики, а вторую - в качестве легковесного скриптового физического движка.
Я заставил небесную сферу и плоскость воды двигаться вместе с кораблем. Это обеспечивает практически бесконечный мир - только по мере движения будут подгружаться разные острова. Волны привязаны к началу координат, а сама плоскость воды передвигается. В этом примере уменьшен размер плоскости, чтобы было видно, как это работает.
Истории
Семейство тестов хи-квадрат: что у них под капотом и какие выбрать для сравнения воронок
Всем привет, меня зовут Вячеслав Зотов, я аналитик в студии Whalekit. В этом тексте я расскажу про статистические тесты и сравнение воронок, а также мы попробуем разобраться, что объединяет χ²-тесты, какова область их применения и подробно исследуем применимость χ²-тестов к анализу воронок. И все это с примерами на Python.
Тест χ² — очень полезный аналитический инструмент, который тем не менее часто вызывает у аналитиков недопонимание и путаницу. Прежде всего это происходит из-за того, что существует целое семейство тестов χ², имеющих разные области применения. Дополнительную путаницу создает то, что тесты χ² часто рекомендуют применять для анализа продуктовых и маркетинговых воронок, а это обычно приводит к ошибочному использованию тестов.
[5] Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Пространственный инвентарь(Часть 2)
Исходники - https://github.com/SalamandrSpb/SurvivalHorror
Теперь приступим к настройке самих виджетов.
Как написать игру на Monogame, не привлекая внимания санитаров. Часть 1, обмазываемся абстракциями
В прошлый раз мы разобрали структуру проекта Monogame. Сегодня мы начнем писать структуру проекта и даже создадим белый квадрат, движением которого сможем управлять.
К классификации игровых жанров
Допустим, мы хотим построить систему команд для игры покер. Но при этом желательно, чтобы она подходила и для других карточных игр, ведь когда-нибудь мы захотим реализовать и их. Более того, хорошо бы реализовать клиент так, чтобы он управлялся с картами без привязки конкретно к покеру, а подходил бы и для дурака, и для преферанса и т.д. Различия в правилах игры существуют только на сервере, а клиент просто получает и отображает всегда одни и те же команды: add, move, remove и другие.
Да и почему только карточных? Разве команды add, move, remove не подойдут для match-3 или стратегий? Для какой игры они вообще могут не подойти, если только в игре есть что перемещать? Вот и получается, что всегда можно подобрать такую достаточно общую и абстрактную систему команд, которая была бы универсальна и подходила для абсолютно всех жанров. Реализация была бы, конечно, везде разная, но названия и параметры — одинаковыми. А значит, не нужно держать у себя в голове кучу протоколов и не нужно тратить время на раскачку, когда переходишь к разработке другой игры. Так, можно одному программисту разрабатывать и поддерживать сразу несколько жанров и не чувствовать себя несчастным по этому поводу. Не говоря уже о серии игр одного жанра.
Чтобы сделать такой универсальный протокол, а затем и фреймворки для каждого жанра на его основе, нужно разобраться во всем жанровом разнообразии, привести его в систему. Чем мы сейчас и займемся.
Как написать игру на Monogame, не привлекая внимания санитаров. Часть 0, вступительная
Данной статьей я открываю серию дневников разработки уже третьей реинкарнации моей будущей игры KARC. Первая версия дошла до минимально играбельного вида и выложена в открытый доступ. Однако, мне не понравилось, как я спроектировал структуру приложения. Поэтому, ошибочно полагая, что я понял, как правильно спроектировать архитектуру приложения, я сделал с нуля вторую версию. В ней мне удалось прогрузить сцену с машинкой игрока, которая реагирует на клавиатуру. Однако, развивать эту версию дальше я не посчитал целесообразным, потому что, увлекшись, накрутил слишком много всего и, самое главное, неправильно. В результате в коде стало очень трудно ориентироваться. Так бы и остался проект в заморозке на неопределенный срок, как и моя мечта делать игры, если бы я в очередной раз не решил попытаться понять архитектурные паттерны, в частности, MVP, и у меня это, внезапно не получилось бы. И так мне MVP понравился, что я понял, как хочу переписать архитектуру KARC. В этот раз я решил фиксировать все свои шаги на бумаге, а потом выложить в широкий доступ. Дело в том, что я делаю игру на фреймворке Monogame, но в сети я не нашел внятного руководства, как сделать на нем что-нибудь законченное. Есть много роликов и статей о том, как сделать какие-то отдельные элементы (например, какой метод подгружает спрайт, но не как лучше это осуществить, если их у вас много и под каждый игровой объект их несколько) или мелкие игры, которые тянут в лучшем случае на технодемку, но не создать какую-либо законченную игру целиком (кое-что на самом деле нашел, и ссылки в последующих статьях будут, но в целом мне не понравилось). Поэтому, возможно, описание моего пути кому-нибудь пригодится.
[4] Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Пространственный инвентарь(Часть 1)
Всем привет.
Вот мы и подошли к созданию инвентаря.
Мы будет создавать пространственный инвентарь на С++. В качестве примера я взял инвентарь с этого канала, который сделан на Blueprints.
[3] Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Анимация движения во все стороны
Всем привет.
В этой части настроим анимацию движения во все стороны для персонажа.
[2] Создание Survival Horror в стиле RE2 на Unreal Engine и С++. Управление персонажем и камерой
Всем привет, сегодня мы настроим управление нашим персонажем, а также управление камерой.
Ты надизайнил, а мне делать: как наладить взаимодействие между отделами дизайна и разработки
В играх достаточно много интерфейсов, за разработку которых, как правило, отвечают две команды: дизайнеры интерфейсов и клиентские разработчики. И так как качество дизайна интерфейсов может повлиять как на пользовательский опыт, так и на продуктовые метрики, наладить коммуникации между этими двумя отделами важно.
Эта статья написана по мотивам одноименного доклада, с которым я и моя сестра Алина выступали на конференции Talents in Games в декабре 2021 года. Я — дизайнер, сестра — разработчик, и уже четвертый год мы работаем в одной продуктовой команде. Сейчас наши команды хорошо ладят и научились решать конфликты, но путь к взаимопониманию и здоровым отношениям между дизайнерами и разработчиками для нас был непростым и довольно долгим.
Статья построена на диалогах, которые когда-либо звучали в нашей команде. Мы попробовали собрать все проблемы взаимодействия между нашими отделами: личностные конфликты, плохая документация и проблемы синхронизации команд, и описали решения, которые для нас сработали.
Ближайшие события
Недельный геймдев: #77 — 10 июля, 2022
Из новостей: доступна бетка PixelBasher, Unity уволила 4% сотрудников, Nexters уволит 235 человек, Godot 4 добавляет режим Movie Maker, Arm представила свой первый графический процессор с аппаратной трассировкой лучей для Android, ЕС обязала Apple и Google разрешить установку приложений со сторонних площадок.
Из интересностей: круглый стол о перспективах российской игровой индустрии; игра, разошедшаяся тиражом в 500 тысяч копий, но вы про неё даже не слышали; встраивание JS в свой игровой движок.
19 способов сделать сокет-сервер на Python. Эволюционный подход. Часть 3. Первый подход к асинхронности
В прошлый раз мы рассмотрели, что такое синхронное программирование, и с какими проблемами с ним сталкивается разработчик. На примере простого сервера с блокирующими сокетами мы увидели, что в синхронно выполняющейся программе все инструкции выполняются строго по очереди, и если встречается системный вызов ввода-вывода, то он может полностью остановить выполнение программы на довольно продолжительное время — пока не завершится. Весь этот период процессор простаивает в ожидании, хотя мог бы выполнять другие задачи, которых накапливается немало. В результате сервер одновременно может обрабатывать только одно подключение. Чтобы перейти ко второму, предыдущее должно быть закрыто.
Решить проблему многозадачности можно стандартными средствами вытесняющей многозадачности: процессами или потоками. Но тут разработчик сталкивается с достаточно серьезными трудностями. Процессы требуют дополнительных ресурсов на свое обслуживание, а потому невыгодны. А потоки влекут за собой множество трудноотлавливаемых и сложновоспроизводимых багов, из-за чего требуется долгая и кропотливая дополнительная работа по синхронизации потоков. В результате мы становимся перед выбором: или дополнительные расходы на железо, или дополнительные расходы на программистов.
Но, к счастью, существует и третий вариант — кооперативная многозадачность с помощью системного вызова select и его аналогов (poll, epoll и других). Он позволяет мультеплексировать несколько задач в одном потоке выполнения и в сущности является обычной синхронной программой. А потому никаких дополнительных трат процессорного времени и времени разработчиков не требуется.
Постмортем: портирование Skyforge на Nintendo Switch
Портирование игр не всегда проходит беспроблемно — одни проекты можно легко портировать, другие — нет. Все зависит от типа игры, платформ и других факторов.
После успешного переноса Warface на Switch мы в студии Allods Team решили портировать нашу MMO Skyforge. Что-то далось очень легко, а что-то — сложнее. Ниже мы перечислим пять вещей, с которыми все прошло как надо, и пять вещей, с которыми возникли трудности.
19 способов сделать сокет-сервер на Python. Эволюционный подход. Часть 2. Блокирующие сокеты и многозадачность
Во второй части нашего похода за сокетами мы от теоретического их рассмотрения перейдем к практике. Мы разберемся, чем плохи блокирующие сокеты, как решить проблему одновременной обработки соединений с помощью процессов, и почему потоки использовать лучше. Попутно разберемся с проблемами синхронизации потоков и зачем нужен GIL. В конце нам должно стать понятно, что с процессами и потоками нужно уметь работать, но никогда не стоит их использовать в реальных проектах, а применять вместо них системный вызов select и асинхронность.
Как происходит генерация мира Minecraft
Задумывались ли вы когда-нибудь, сколько на нашей планете песчинок? По грубым оценкам, более 7 квинтиллионов! Это 7 с 18 нулями. И всё-таки это даже меньше половины количества уникальных миров в Minecraft. Как же Minecraft и другим похожим играм удаётся создавать такие сложные, красивые, однако полностью процедурные миры? В этой статье я расскажу, как игра генерирует свои миры, от самой высокой горы до самой глубокой пещеры.
Часть 1: процедурная генерация
Для многих из вас Minecraft может быть первой (а может быть, и единственной) игрой, в которой миры не творятся вручную дизайнером уровней, а создаются процедурно.
Однако первой игрой с процедурно сгенерированным миром является «Elite», первая версия которой вышла для компьютера BBC Micro в 1984 году. Это прапрадед относительно новой «Elite: Dangerous», выпущенной в 2014 году.
Автоматическая генерация новых миров может казаться привлекательным способом ленивого создания бесконечного контента для игры. Однако на самом деле всё наоборот! Чтобы научить машину тому, как выглядит хороший уровень… нужно быть очень хорошим программистом и дизайнером уровней.
Контент должен быть достаточно разнообразным, чтобы выглядеть свежим, но не настолько разнообразным, чтобы казаться атипичным. И необходимо создавать миры, на которые не просто интересно смотреть, но которые обеспечивают справедливую с точки зрения игрока сложность.
Разработка собственного плагина для сервера Minecraft
Еще с детства я начал покорять бесконечные просторы Minecraft. Естественно о разработке в то время никакой речи не шло. Но с недавних пор загорелся идеей создать о свой проект серверов.
В данной статье расскажу свой первый опыт написания плагина для сервера Minecraft. На превью можно заметить результат.
19 способов сделать сокет-сервер на Python. Эволюционный подход. Часть 1. Введение
Дабы исчерпать до дна тему сокетов в Python я решил изучить все возможные способы их использования в данном языке. Чтобы всех их можно было испытать и попробовать на зуб, были созданы 19 версий простого эхо-сервера: от примитивного использования класса socket до asyncio. Блокирующие и неблокирующие сокеты, процессы и потоки, select'ы и selector'ы, коллбеки и сопрограммы — все эти темы расположены в эволюционном порядке, чтобы один пример плавно перетекал в другой.
Отдельно разобрано появление асинхронности в Python. На примерах детально показано, как и зачем появились итераторы, из них — генераторы, сопрограммы. Ближе к концу построен учебный макет библиотеки asyncio с минимально необходимым кодом, чтобы любой (даже такой, как я) смог разобраться, как на самом деле устроена асинхронность, как там все внутри работает.
Пишу подробно, чтобы случайно чего не пропустить. Поэтому понятно должно быть всем.
Вклад авторов
alizar 5443.2Milfgard 3768.0Weilard 2321.0dalerank 1879.0haqreu 1851.0Suvitruf 1839.5HotWaterMusic 1802.8InlyIT 1616.4BasmanovDaniil 1367.2GlukKazan 1211.8