• Как реализовать алгоритм построения линии с обходом препятствий?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Алгоритм плоской укладки графов: здесь
    2. Иерархический подход для автоматического размещения ациклических графов: здесь

    Должно это помочь: https://flowchart.js.org/
    Ответ написан
    Комментировать
  • Есть ли русские книги о разработке игр?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Хочу перейти на новый уровень в разработке игр.


    Выучите английский уже наконец! Сразу перейдете на новый уровень (причем это актуально не только для геймдева, и даже не только в IT - это актуально в любой области знаний)

    Поймите уже наконец, что вся актуальная информация публикуется на английском и большая ее часть не переводится на русский (либо переводится со значителньой задержкой во времени)
    Ответ написан
    4 комментария
  • Есть ли русские книги о разработке игр?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Самый верный путь это читать об этом

    Ничего подобного. Самый верный путь - практика. Нужно брать и делать.
    Ответ написан
    3 комментария
  • Как продлить время авторизации игрока в web игре?

    @abbaboka
    А в чем проблема?
    Почему нельзя отправлять запрос заранее, пока старый еще не устарел и есть время.
    А потом инвалидировать старый токен только после получения нового?
    Ответ написан
    Комментировать
  • Хочу работать программистом в gamedev?

    saboteur_kiev
    @saboteur_kiev Куратор тега Разработка игр
    software engineer
    Первый необходимый навык - умение пользоваться поиском.

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

    План такой:

    * Ищете вакансии в gamedev
    * Смотрите требования, выбираете какое направление интересно вам - андроид/web/C++/QA
    * Учите то, что указывают в вакансиях
    * как выучите - пишете резюме и бомбардируете эти вакансии.

    5-10 (или если все плохо 50-100) собеседований и профит.

    P.S. Ну и еще, геймдев гораздо меньше, чем разработка вообще, поэтому вполне можно начать не с геймдев, а с любой разработки.
    Ответ написан
    2 комментария
  • Как теория графов применяется в программировании?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Прежде всего хочу заметить, что львиная доля программистов не имеют непосредственно дел с теорией и математикой. Можно быть успешным профессионалом, так никогда и не написав собственной реализации алгоритма Дейкстры и даже не имея представления о том, как он работает. Но всё же стоит хотя бы поверхностно познакомится с графами, так как это одна из основных структур данных. Сфера их применения очень обширна, часто это алгоритмы поиска решений - кратчайшего пути по маршруту, эффективного расположения дорожек на схеме, победной игровой стратегии и т.п. Реальный пример использования графов - это sea-of-nodes JIT-компилятора. JIT-компилятор строит граф потока данных и граф потока выполнения, в которых узлы - это инструкции программы, а рёбра - это порядок вызова инструкций и порядок присвоения данных переменным, потом ищет способы этот граф оптимизировать и по оптимизированному графу генерирует бинарный код.

    int average(int a, int b) {
      return (a + b) / 2;
    }

    average.png
    Ответ написан
    Комментировать
  • Можно ли написать AAA-игру на языке программирование Си?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Можно. Но вы не напишете. И никто в одиночку без вагона кокаина - тоже. Посмотрите для примера размер команды современной ААА-игры. Думаете они там только печеньки офисные едят?
    К тому же выбор ЯП конечно важен для создания игры, но далеко не только он важен. Начните ХОТЯ БЫ с выбора движка. Или вы сами будете рендер писать? Знаний хватит?
    Ответ написан
    Комментировать
  • Можно ли написать AAA-игру на языке программирование Си?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Можно.

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

    C - язык системных программ, библиотек, драйверов, консольных утилит. Что-либо юзерское на нем лабать сложно из-за необходимости колхозить множество вещей, уже давно сделанных в плюсовых тулкитах.
    Ответ написан
    1 комментарий
  • Как восстанавливать энергию через определённое время?

    be_a_dancer
    @be_a_dancer
    Backend/Fullstack Developer
    Можно очень просто. Сохраняешь в бд последнее время, когда игрок обновил энергию. Потом, при следующем запросе ты смотришь, пора? Далее, если необходимо, проверяешь, сколько раз стоило восстановить энергию. Ну и добавляешь необходимое количество пунктов.
    Ответ написан
    8 комментариев
  • Какой стек технологий выбрать для онлайн-игры?

    abyrkov
    @abyrkov
    JavaScripter
    Вопрос необходимо конкретизировать, рассматривать некоторые вещи на "сферическом коне в вакууме" невозможно.

    По скольку ваша стратегия наверно будет ориентирована на пользователей компьютеров и реалтайм, Node.js вполне уместен, поскольку PHP не очень дружит с сокетами, а вы их скорее всего и будете использовать.
    Чистый WebGL - тот еще мазохизм, наверное вы будете использовать какую-то библиотеку. Если вы ориентируетесь на 3D, можно порекомендовать вам использовать Three.js, который, к тому же, может рендерить на основе Canvas. То есть, если компьютер игрока не поддерживает WebGL, можно переключиться на Canvas без особых изменений кода.
    Ответ написан
    Комментировать
  • Как создать игровой мир?

    saboteur_kiev
    @saboteur_kiev Куратор тега C++
    software engineer
    Чтобы создать игровой мир, следует освоить азы программирования, и научиться работать со структурами данных, написать несколько программ попроще для практики.

    Затем следует освоить программирование на среднем уровне, и только после этого написать несколько проектов или игр попроще. Для практики.

    Тогда не будут невнятных фраз типа "в массиве вроде как нельзя удалить", "процессор с ума сойдет", "как сделать чтобы много памяти игровой мир не кушал"
    Ответ написан
    2 комментария
  • Стоит ли заранее заботится о возможности поддержки предыдущих версий многопользовательской мобильной онлайн игры? И как?

    @MarkusD
    все время мелю чепуху :)
    В процессе сопровождения игры может измениться протокол клиент/серверного взаимодействия или еще что-то, после чего предыдущие версии игры перестанут поддерживаться.

    Честно говоря, изменение и обновление протокола между версиями продукта - это норма жизни. Только не путай с выпуском обновлений контента, это другой вопрос.

    Можно сказать так: сетевой протокол полезно периодически полностью менять. Это хорошая профилактика от разного рода паразитов твоего проекта. Этакая мера гигиены.

    В процессе обновления протокола мы обычно приходим к одному из двух вариантов:
    • Меняется именно протокол - т.е. набор и содержание пакетов.
    • Меняется сервисный код протокола - т.е. сервисный код для сериализации данных в пакеты.


    В первом случае проблем особых не возникает. Второй случай действительно приводит к нарушению совместимости.
    Чтобы в первом случае добиться совместимости между версиями клиентов и сервера, разработчик обычно использует библиотеки сериализации с поддержкой обратной (или/и прямой) совместимости.
    Примерами таких библиотек являются Google Protobuf, Google Flatbuffers и Cap'N Proto. (да, тега C++ нет, но делу это не мешает)
    Еще я сталкивался с самостоятельно разработанными решениями, которые в разной степени обладают достоинствами приведенных библиотек.

    Есть ли статистика по влиянию обязательных обновлений игры на заинтересованность пользователей?

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

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

    Если мы ведем проект для мобильных платформ, то там ситуация с обновлениями еще интереснее. Тебе никто никогда не скажет, когда в конкретном маркете обновится твоя версия клиента. Выкладка версии - это долгий процесс, синхронизировать его между разными маркетами невозможно. Если у тебя в охвате только GooglePlay и AppStore, то это еще половина проблемы. Обычно маркетов десятки, куда обязательно входит Я.Стор для Android, маркеты от Самсунга, сотовых операторов, мелких лавочников и тому подобного. А если мы заходим в Китай, то число маркетов начинает достигать сотен. И каждый из них твое приложение обновит только когда захочет.
    Это все говорит о том, что обновление сервера и мобильных клиентов - дело несинхронизируемое. Сервер сразу должен быть готов принять обновленные клиенты, поэтому его надо обновить одномоментно с выкладкой версий в маркеты. И в то же время этот новый сервер должен уметь впускать старые клиенты, потому что новые еще не прошли проверку и не выложились для скачивания пользоавтелям.

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

    Да, реально, примеры таких игр уже лет 8 с лишним бороздят просторы Appstore и GP. Названий не дам, рекламой не занимаюсь, пеарить не привык.
    Я в своей работе использую Cap'N Proto и Flatbuffers. Эти две библиотеки покрывают задачи обратной совместимости для протокола и бинарных ресурсов. Использования этих библиотек хватает для свободы изменять данные не боясь потерять клиентов.
    В общем, для решения этой проблемы нужны инструменты обеспечения обратной и прямой совместимости.

    Важно понимать, что совместимость обеспечивать надо не только для протокола, но и для ресурсов клиента.
    Ресурсы могут быть залиты на локальный CDN провайдера пользователя и поставляться по каналу связи с льготным тарифом, но у пользователя может не быть возможности зайти в Appstore и обновить само приложение клиента.
    Поэтому, старый клиент должен иметь возможность запускаться с новыми ресурсами в режиме совместимости.
    Именно эту задачу и решает библиотека Flatbuffers. Она дает возможность обновлять формат бинарных данных вперед и сохранять очень эффективный доступ к ним через старую версию формата.

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

    Может ли задача сопровождения предыдущих версий сильно влиять на архитектуру ПО, скорость и процесс разработки?

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

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

    Если сказать в общем. Да, обеспечивать совместимость - это тяжело. Это ряд архитектурных решений, которые должны быть сделаны правильно. Но если навыки уже есть, если есть опыт, если есть видение проекта, то обеспечение совместимости - штука посильная.
    Ответ написан
    1 комментарий
  • Unity rpg инвентарь, реализация?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Приветствую! Нужно съесть манную кашу. Пробовал сначала сам есть - вышла какая то дичь - хотя формально я ее съел, но измазался в ней весь.
    Пересмотрел кучу туториалов как есть манную кашу - у всех принцип одинаков, но каждый есть по разному - кто то ложку боком заносит, кто то вообще левой рукой ест. А мне нужно есть через трубочку - я не нашел такого функционала.
    Надеюсь у кого то есть годные статьи\видео\примеры, либо кто то может объяснить как есть кашу через трубочку, в идеале на польском.

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

    flexer1992
    @flexer1992
    Unity Developer
    Написание такого сервера достаточно сложная процедура и если не было опыта в разработке, то маловероятно что со старта получится что-то работоспособное. Могу посоветовать посмотреть на эту книгу, примеры кода в ней тоже имеются. https://vk.com/wall-54530371_90186
    Ответ написан
    2 комментария
  • Куда сводить школоту познакомить с технологиями game dev?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    А вы уверены что это будет мотивацией? Ну кроме радости от офисных плюшек. Обычно у школоты и так розовых очков дофига, и их разбивать приходится. А то думают что в геймдеве легко и быстро все...
    Ответ написан
    8 комментариев
  • Так у чего производительность выше и вероятность успешного завершения проекта у node.js или Python?

    Jump
    @Jump
    Системный администратор со стажем.
    Цена вопроса разработки.
    Зависит исключительно от вас, кого найдете и как договоритесь.
    Цена серверов.
    Опять же исключительно от вас, за сколько купите, и насколько тяжелым будет проект.
    Вероятность успешного завершения проекта.
    Зависит исключительно от умения руководить проектом, и удачи.
    Производительность.
    Зависит от грамотного выбора архитектуры и грамотной реализации.
    Маштабируемость.
    Зависит от грамотного выбора архитектуры и грамотной реализации.
    Отказоустойчивость.
    Зависит от грамотного выбора архитектуры и грамотной реализации.

    При чем тут node.js и Python совершенно непонятно.

    Для реализации крупного проекта нужно-
    1. Составить техническое задание, где будет четко и в деталях указано то, что должно получиться.
    2. На основании ТЗ разработать архитектуру проекта.
    3. На основании архитектуры выбрать инструменты реализации, т.е языки, фреймворки, среду разработки, и.т.д.
    Ответ написан
  • Почему в Django преобразование List(QuerySet) такое медленное?

    @deliro
    Научись работать с Django
    Научись работать с Python (в частности, pep8 и iterable)
    Научись пользоваться ORM (only, defer, select/prefetch related) и использовать raw как исключение, а не наоборот
    Научись строить архитектуру БД (в частности,
    кучей всяких JOIN из шести таблиц
    )

    И не будет таких медленных запросов.

    А ответом на вопрос будет примерно вот что:
    Если QuerySet1 ещё не сфетчен, то QyerySet1[i].id делает запрос к БД (итого, 35 запросов)
    list(QyerySet1) делает фетч и .id уже берётся из оперативы.

    P.S. Используй django-debug-toolbar. Увидишь все свои SQL запросы и время их исполнения.
    Ответ написан
    6 комментариев
  • Существует ли аналог Tiled Map Editor, но для 3D?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Комментировать
  • В чём принципиальная разница, использовать магический метод __getitem__ или получать элемент по индексу?

    MrLinch
    @MrLinch
    Just like coding...
    Разница все же есть. Не в результате, а методе которым это результат получаем. (использование [] эффективней)

    Припустим есть у нас такой код

    items = [1, 2, 3, 4]
    
    def get_item_as_method():
        return items.__getitem__(1)
    
    def get_item_as_operator():
        return items[1]


    Если мы дизассемблируем (модуль dis) эти функций увидим следующие:

    Для get_item_as_method:
    LOAD_GLOBAL            0 (items)
    LOAD_ATTR                1 (__getitem__)
    LOAD_CONST             1 (1)
    CALL_FUNCTION        1 (1 positional, 0 keyword pair)
    RETURN_VALUE


    Для get_item_as_operator:
    LOAD_GLOBAL              0 (items)
    LOAD_CONST               1 (1)
    BINARY_SUBSCR
    RETURN_VALUE


    Видим в первом случае для получения результата нужно выполнить две операций (LOAD_ATTR и CALL_FUNCTION), а в первом всего одну BINARY_SUBSCR.
    Ответ написан
    Комментировать