• Что означает ноябрьское обновление Steam для инди-разработчиков?

      Привет! Не так давно в Steam произошло обновление, которое по каким-то причинам не было освещено на Хабре. Но если вы разрабатываете игры и называете себя модным словом инди, то это обновление повлияет на вас самым что ни на есть прямым образом.


      Что же произошло?
      Читать дальше →
    • Фотостудия для съёмок пластилиновой игры

        Привет! В жизни почти каждого разработчика игр наступает момент, когда он отбивается от стаи, выкапывает себе нору и начинает в одиночку делать «лучшую в мире игру, не то что эти всякие». 2 года назад это случилось и со мной. Не обладая навыками художника, я решил замахнуться на stop-motion анимацию и делать всю графику из пластилина.

        image
        Читать дальше →
      • Создание PostProcess материала для эффекта лечения в Unreal Engine 4

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

          image

          Читать дальше →
          • +16
          • 6.2k
          • 3
        • Книга «Многопользовательские игры. Разработка сетевых приложений»

            image Привет, Хаброжители! Ранее мы Вас спрашивали переводить ли книгу «Multiplayer Game Programming: Architecting Networked Games (Game Design)». Недавно новинка пришла из типографии.

            В этой книге подробно рассматриваются все основные понятия, необходимые для создания сетевых многопользовательских игр. Вначале мы познакомимся с основами сетевых взаимодействий: как работает Интернет и как выполняется пересылка данных на другие компьютеры. Далее, после закладки фундамента, будут рассмотрены основы передачи данных в играх, как подготавливать игровые данные к передаче по сети, как изменять содержимое игровых объектов по сети и как организовать взаимодействие компьютеров, вовлеченных в игру. Затем мы поговорим о том, как компенсировать ненадежность соединения и задержки при передаче данных по сети и как обеспечить масштабируемость и безопасность игрового кода. В главах 12 и 13 рассматриваются службы объединения игроков для выделенных серверов и использование облачного хостинга — две темы, чрезвычайно важные для современных сетевых игр.
            Читать дальше →
          • Pico8 — несуществующая игровая консоль

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

              image
              Читать дальше →
            • Как рендерится кадр нового Doom

              • Translation


              Выпущенный в 1993 году первый DOOM внёс фундаментальные изменения в разработку игр и механик, он стал мировым хитом и создал новых идолов, таких как Джон Кармак и Джон Ромеро.

              Сегодня, 23 года спустя, id Software принадлежит Zenimax, все основатели уже покинули компанию, но это не помешало коллективу id продемонстрировать весь свой талант, выпустив отличную игру.
              Читать дальше →
            • Null, великий и ужасный

                Ошибка дизайна


                Именно так и никак иначе: null в C# — однозначно ошибочное решение, бездумно скопированное из более ранних языков.


                1. Самое страшное: в качестве значения любого ссылочного типа может использоваться универсальный предатель — null, на которого никак не среагирует компилятор. Зато во время исполнения легко получить нож в спину — NullReferenceException. Обрабатывать это исключение бесполезно: оно означает безусловную ошибку в коде.
                2. Перец на рану: сбой (NRE при попытке разыменования) может находится очень далеко от дефекта (использование null там, где ждут полноценный объект).
                3. Упитанный пушной зверек: null неизлечим — никакие будущие нововведения в платформе и языке не избавят нас от прокаженного унаследованного кода, который физически невозможно перестать использовать.

                Этот ящик Пандоры был открыт еще при создании языка ALGOL W великим Хоаром, который позднее назвал собственную идею ошибкой на миллиард долларов.

                На самом деле все не так плохо
              • Интерполяция замкнутых кривых

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


                  Читать дальше →
                • Input lag во время рендеринга и как его побеждать

                    Привет всем. Многие из вас знакомы с лагом ввода. Это бывает, когда вас в очередной раз убивают в компьютерной игре, и вы кричите: «Ну я же нажал блок/атаку/уворот». Ну а затем джойстик летит в стену. Знакомо? Происходит это потому, что между нажатием клавиш и появлением результата на экране проходит значительное время. Фактически, когда вы смотрите в экран — вы видите прошлое состояние, которое может абсолютно не отражать действительность.

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

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

                      Например, iPad 2 — всего в нем 512 Мб RAM. Однако приложению доступно только примерно 275 Мб. Когда занимаемая приложением память будет приближаться к этой границе, операционная система пришлет так называемое «Memory warning» — мягко, но настойчиво предложит освободить память. И если лимит все же будет превышен, операционная система остановит приложение. Пользователь будет думать, что ваша игра упала и побежит писать гневное письмо в саппорт.



                      Главный потребитель памяти — это, конечно, графика. В этой статье мы попробуем рассказать о пусть немного сложном, но эффективном способе, который используется для уменьшения занимаемой текстурами памяти, а также для повышения скорости отрисовки.
                      Читать дальше →
                    • AI монстров и поиск пути с помощью тепловых карт

                        image Допустим, у нас есть плоская карта, состоящая из тайлов. На некоторых тайлах стоят монстры, а на некоторых других – всякие штуки, которые монстров интересуют: игрок, оружие, зелья, боеприпасы и прочее в том же духе. Задача состоит в том, чтобы объяснить монстрам, к каким штукам им идти и как. Путь должен быть близким к оптимальному, а время вычисления – настолько маленьким, насколько это возможно. Один из самых простых способов – использовать тепловую карту дистанций до определённой цели или целей.
                        Читать дальше →
                      • Библия движений Doom. Часть 1

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



                        Метрика


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

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

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

                        Читать дальше →
                        • +67
                        • 35.8k
                        • 9
                      • Аврал: вы работаете изо всех сил, чтобы успеть к дедлайну. Что теперь?

                        • Translation
                        Автор статьи, Мэтью Бёрнс, напряжённо работал над такими игровыми франшизами, как Halo, Call of Duty и Destiny. Он писатель и разработчик игр из Сиэтла.



                        Аврал, или работа с полным напряжением сил в попытках успеть к дедлайну (на сленге англоязычных программистов – кранч [crunch]) – прискорбное явление в нашей индустрии. И пока кто-нибудь не придумает решения этой проблемы, что нам с ним делать?

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

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

                        Поэтому, если вы недавно вошли в эту индустрию и попали в свой первый аврал, или если вы хотите заняться играми, но волнуетесь из-за ужасных историй по поводу авралов, вот вам мои соображения по поводу возникновения этого явления и того, как его пережить, если уж вы в него вляпались.
                        Читать дальше →
                      • Как подружить юнит-тестирование с базой данных

                          Как подружить TDD подход при работе с базой данных
                          История о том, как разрабатывалась система автоматического тестирования методов, взаимодействующих с базой данных, с подробным описанием того, с какими подводными камнями пришлось столкнуться в процессе разработки и внедрения системы в окружение проекта.
                          Читать дальше →
                        • Грязные трюки мобильной разработки от J2ME до Android

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


                            Читать дальше →
                          • C++11 variadic templates и длинная арифметика на этапе компиляции

                            • Tutorial
                            За тридцать лет, прошедших с момента его появления в недрах Bell Labs, C++ проделал долгий путь, пройдя от «усовершенствованного C» до одного из самых популярных и выразительных компилируемых языков. Особенно много, на авторский сугубо личный взгляд, дал C++ новый стандарт C++11, стремительно обретающий поддержку компиляторов. В этой статье мы постараемся «пощупать руками» одну из его мощнейших фич — шаблоны с переменным числом аргументов (variadic templates).

                            Разработчики, знакомые с книжками Александреску, вероятно, помнят концепцию списка типов. В старом-добром C++03 при необходимости использовать заранее неизвестное число аргументов шаблона предлагалось создать такой список и потом хитрым хаком его использовать. Этим способом реализовывались кортежи (ныне std::tuple) и проч. и проч. А сама глава про списки типов ясно давала понять, что на шаблонах C++ можно проводить практически любые вычисления (заниматься λ-исчислением, например), лишь бы их можно было записать в функциональном стиле. Эту же концепцию можно было бы применить и к длинной арифметике: хранить длинные числа как списки intов, вводить основной класс вида
                            template<int digit, class Tail> struct BigInteger { };
                            
                            , операции над ним и так далее. Но во славу нового стандарта мы пойдём другим путём.
                            Читать дальше →
                          • Функциональное программирование непопулярно, потому что оно странное

                            • Translation
                            Я знаю людей, которые искренне недоумевают по поводу того, что функциональное программирование не очень популярно. К примеру, сейчас я читаю книжку «Из смоляной ямы» (Out of the Tar Pit), в которой авторы после аргументов в пользу функционального программирования говорят:
                            Читать дальше →
                          • Пишем сериализатор для сетевой игры на C++11

                              Написать этот пост меня вдохновила замечательная статья в блоге Gaffer on Games «Reading and Writing Packets» и неуёмная тяга автоматизировать всё и вся (особенно написание кода на C++!).

                              Начнём с постановки задачи. Мы пишем сетевую игру (и сразу MMORPG, конечно же!), и независимо от архитектуры у нас возникает необходимость постоянно посылать и получать данные по сети. У нас, скорее всего, возникнет необходимость посылать несколько разных типов пакетов (действия игроков, обновления игрового мира, просто-напросто аутентификация, в конце концов!), и для каждого у нас должна быть функция чтения и функция записи. Казалось бы, не вопрос сесть и написать спокойно эти две функции и не нервничать, однако у нас сразу же возникает ряд проблем.

                              • Выбор формата. Если бы мы писали простенькую игру на JavaScript, нас бы устроил JSON или любой его самописный родственник. Но мы пишем серьёзную многопользовательскую игру, требовательную к трафику; мы не можем позволить себе отправлять ~16 байт на float вместо четырёх. Значит, нам нужен «сырой» двоичный формат. Однако, двоичные данные усложняют отладку; было бы здорово, если бы мы могли менять формат в любой момент, не переписывая целиком все наши функции чтения/записи.
                              • Проблемы безопасности. Первое правило сетевой игры: не доверяй данным, присланным клиентом! Функция чтения должна уметь оборваться в любой момент и вернуть false, если что-то пошло не так. При этом использовать исключения считается неважной идеей, поскольку они слишком медленные. Мамкин хакер пусть и не сломает ваш сервер, но вполне может ощутимо замедлить его беспрерывными эксепшнами. Но вручную писать код, состоящий из if'ов и return'ов, неприятно и неэстетично.
                              • Повторяющийся код. Функции чтения и записи похожи, да не совсем. Необходимость изменить структуру пакета приводит к необходимости поменять две функции, что рано или поздно приведёт к тому, что вы забудете поменять одну из них или поменяете их по-разному, что приведёт к трудно отлавливаемым багам. Как справедливо замечает Gaffer on Games, it is really bloody annoying to maintain separate read and write functions.

                              Всех интересующихся тем, как Бендер выполнил своё обещание и при этом решил обозначенные проблемы, прошу под кат.
                              Читать дальше →