Ответы пользователя по тегу Разработка игр
  • Как рассчитать "нужды" NPC в числовом виде на основе его требований и инвентаря?

    @rPman
    В общем случае это задача комбинаторики, по простому оптимальный вариант можно найти перебором (что само собой не оптимально по затратам процессора/памяти).

    Тебе нужно как то определить функцию (математическую или буквально программа) принятия решения NPC о его поведении в каждый тик на основе его состояния и возможно истории его действий.

    Почти наверняка это будет функция с какими то граничными условиями и коэффициентами... твоя задача подобрать эти значения таким образом чтобы например максимизировать время его жизни (или у тебя там другие целевые критерии). Обычно пишут оценочную функцию, так же на основе состояния, которую и максимизируют. Например собирай оценку счастья NPC на основе событий в его жизни, как часто испытывает сытость, как долго живет, с каким количеством других сущностей он контактировал, умножаешь каждый параметр на коэффициент, складываешь и полученную функцию максимизируешь. Есть алгоритмы многомерной (по многим параметрам) оптимизации минимизации (если тебе нужно максимизировать f(x) а алгоритм умеет только минимизировать, то работай с 1/(f(x)+1)). Эти алгоритмы хороши если параметров мало и функция имеет мало ловушек (локальных минимумов).

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

    Строишь свой мир, строишь для всего мира качественную оценку (например сумма всех параметров счастья всех NPC), затем всем NPC задаешь на старте случайные параметры, запускаешь его на существование до смерти всех или лимита времени, меняешь параметры, повторяешь...
    Ответ написан
  • На каком языке программирования писать сервер для игры?

    @rPman
    Пишите на том, что хорошо знаете. Учиться программировать на неизвестном языке сразу в продакшен - это почти наверняка гиблое дело, хотя конечно нет ничего невозможного.

    php последние годы стал универсальным, как для запрос-ответных систем так и для приложений непрерывного действия. При этом его скорость работы одна из самых быстрых среди интерпретируемых языков программирования, сравнимо и незначительно быстрее его только javascript (nodejs) но и там с оговорками.

    Но прежде чем что то писать, продумайте все же досконально, как у вас будет работать вся система в целом. Например, есть ли необходимость в оперативной синхронизации действий пользователей (шутеры) или хватит лага на все клиенты -> сервер -> все клиенты 'комнаты'.

    p.s. Объяснить в простом ответе что и как делать невозможно, Сергей П привел отличную аналогию.
    Ответ написан
    5 комментариев
  • Комп или ноут для ue5?

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

    Единственная причина выбирать ноутбук для работы - вынужденная мобильность.

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

    Ноутбуки и планшетники это устройства потребления контента
    Ответ написан
    Комментировать
  • Возможно ли реализовать одноранговый мультиплеер с защитой от жульничества?

    @rPman
    Проблема византийских генералов, решалась в криптовалютах, успешно только с помощью proof of work.

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

    Если обнаружено расхождение состояний при минимум двух частниках, то игра заканчивается, при трех и более участников можно считать истинными тех участников, количество одинаковых состояний у которых наибольшее, если это определить нельзя - игра заканчивается, иначе возможно исключение виновников
    Это позволит решить:
    * необходимость бороться с подтасовками (изменение своего баланса)
    * необходимость бороться с клеветой (изменение чужого баланса)

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

    Никакими средствами надежно нельзя будет решить проблему автоматизации. Ее решают статистически (т.е. с некоторой вероятностью ошибки в обе стороны), собирая информацию о типовом поведении игроков, ботов можно выявить по не типичному поведению (есть алгоритмы на основе нейросетей и не только). Дико дорогая операция, эту проблему не могут нормально решить крупные компании, теряя миллионы на читерах.
    Ответ написан
    Комментировать
  • Как сделать так чтоб хвост змейки двигался по направлению головы winforms C#?

    @rPman
    Если у тебя змейка максимально примитивная, где поле клетка одного цвета (фон) и змея - клетка другого цвета (речь не о цвете а о том что клетки змеи неразличимы), то алгоритм сводится к тому чтобы как то хранить все квадраты змеи для того чтобы знать, в каком порядке их удалять.

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

    Но возможны другие варианты, например хранение всей матрицы поля, в каждой ячейке можно хранить информацию о наличии в ней яблока, змеи, а для змеи еще и направление ее движения... тогда достаточно хранить координаты головы и хвоста, при добавлении головы, в старое место помечать куда она направилась, а при удалении - делать шаг в направлении, сохраненном в ячейке.
    Ответ написан
    Комментировать
  • Где найти 3д модель города?

    @rPman
    Я помню были эксперименты по созданию трехмерной модели с помощью фотограмметрия панорамных фото street view от Гугла и Яндекса, но как я понимаю готового результата не будет, только как основа для дальнейшего ручного рисования.

    Дешевле пустить дроны с лидаром...
    Ответ написан
    Комментировать
  • Какие сервера для игры на Unity лучше?

    @rPman
    Если 'разработать игру' - это использовать готовый конструктор, который предоставляет и клиент и сервер, и тебе этого функционала достаточно - то само собой делать свой сервер в такой ситуации неоправданные затраты.

    Если логика твоей игры не типовая, то лучше писать свое.

    p.s. игровой сервер создать часто бывает проще игры, а если есть возможность переиспользования кода (используется тот же язык программирования и фреймворк) то часть даже не придется переписывать, а можно будет взять из клиента (например та часть что отвечает за валидацию и защиту от читерства), но чаще и этого не делают.
    Ответ написан
    Комментировать
  • Какие есть хорошие отечественные движки для создания 2D игр с бесплатным доступом?

    @rPman
    Нет таких
    Пиши на unity, у тебя будут знания которые хоть где то ценятся, когда (если) политическая ситуация разрешится в пользу глобализации
    Если же не разрешится, проблема it нас будет волновать в последнюю очередь, из-за отсутствия компьютеров в принципе
    Ответ написан
    1 комментарий
  • Какой размер изображения мне выбрать для ассетов персонажа игры 2д?

    @rPman
    Точно помню чтобы было меньше проблем с кросплатформенностью (мобильные игры) нужно размер текстуры делать степень двойки (кажется это особенность алгоритмов сжатия), т.е. вариантов не густо, перебери граничные там где изображение становится совсем некрасивым или еще нормальным, вариантов будет не много. Вроде несколько лет назад 2048х2048 была максимальная рекомендация (может сейчас уже 4к но наврят ли больше)

    да, справйты можно и нужно объединять в группы для хранения на одной текстуре, но чтобы оптимально их там размещать, так же нужно их размер привязывать к размеру текстуры, деленый на количество размещенных рядом
    Ответ написан
    Комментировать
  • Можно ли использовать TCP протокол для игрового сервера?

    @rPman
    Во первых, собирай статистику по фреймам, смотри на графиках, почти наверняка это будут периодические пики с превышением времени на доставку данных

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

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

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

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

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

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

    Но главное, сетевой трафик в такой схеме значительно снижается, ведь рассылаются буквально только нажимаемые клавиши и изредка хеш-суммы состояния мира для валидации их корректности (все клиенты и сервер по завершению каждого фрейма должны сравнить состояния друг друга например путем вычисления хеш суммы по отсортированным объектам, всем или по какому то критерию, например попадающим в ячейку матрицы по координатам, если там происходили изменения)
    Ответ написан
    Комментировать
  • Нужен ли разработчику на игровых движках знания из программировния "низкой" гафики?

    @rPman
    Разработчик разработчику рознь

    Кто то модифицирует физику, создавая искривленные пространства, таким точно нужно как минимум понимание как все устроено в движках на низком уровне.

    А кто то будет клепать сотнями игры кликеры, где ни графики ни геймплея ни сложности, такие используют игровые движки больше как инструмент картинку отобразить (этакий оверкил). Таким и вовсе не понадобится даже понимать что такое opengl

    Хотя, наступит момент, когда даже такие разработчики упрутся в непонимание, пример, тут один спрашивал почему у него тормозит, когда он объекты складывает в стакан, а они на основе прозрачных текстур сделаны, так как объекты неровные, спрайты взаимопересекаются и наступает момент когда количество полупрозрачных наложений превышает возможности мобильных видеокарт и все лагает, когда как содержимое стакана после падения объекта не меняется, нет нужды это содержимое каждый раз пересчитывать, пусть все оно будет одним объектом и все.
    Ответ написан
    Комментировать
  • Лаунчер игрового проекта скачивание файлов игры через torrent, хорошие ли решение?

    @rPman
    да, это наилучшее решение из простых, используя libtorrent можно установленные файлы клиента оперативно и максимально просто обновлять
    Ответ написан
    Комментировать
  • Как создать 3D игру не умея моделировать?

    @rPman
    варианты:

    Научиться (долгий и сложный путь, нет гарантий в результате)
    Найти деньги и заплатить тому кто умеет
    Либо, если это не комерческий проект, найти единомышленника с такими умениями (очень сложно)

    p.s. есть игры в принципе без графики и персонажей, логические аркады, для 3d это тоже реально но чтобы было красиво все равно придется потрудиться (шейдеры красивые писать)
    Ответ написан
  • Как сделать добычу дерева в 2D игре?

    @rPman
    В общем два подхода (сначала игровые реши для себя)
    когда берешь в руки топор у тебя появляется/активируется скил (действие, такое же как ходить прыгать и т.п.) рубить
    - скил должен требовать чтобы в радиусе действия скила было дерево и даже к примеру должно быть выбрано (то с чем скил будет взаимодействовать) иначе он не может быть активирован (бывает когда при нажатии скила персонаж автоматически бежит к ближайшему объекту, который ему нужен, удобно когда надо бить по врагам мечом)
    - скил ничего не требует а просто активируется, воздействуя на объекты в радиусе действия скила
    а там, если что попало - рубит

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

    Вот от сюда и начинай искать способы реализации.

    Например делать топор отдлельным объектом, а взаимодействие его через коллизии (подойдет для второго варианта, но мне кажется это заметное замедление, особенно когда персонажей с такой реализацией действий много, ведь это как минимум удвоение объектов).

    Можно сделать топор просто свойство у персонажа (анимация все равно для топора нужна, так и реализуй модель с топором, пусть и вариативным если нужно разный внешний их вид), т.е. это не топор ударяет по дереву а персонаж бьет дерево, проигрывая анимацию удара.
    Ответ написан
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @rPman
    Раньше было можно, официально, через java applet (посмотри вроде тут обсуждалось что подсовывать и как)

    Теперь этот режим отключен в браузерах по умолчанию, так как еще более ненадежный чем flash (проблем больше чем пользы)
    Ответ написан
    Комментировать
  • Разработка игр для андроид на языке С++?

    @rPman
    android это зоопарк железа (и не только процессоры), к сожалению красивого фреймворка именно для c++ нет, отсюда разработка даже простейшего приложения (особенно если нужен доступ к перифирии и графическому ускорителю) очень сложны, хотя разрабатывать библиотеку, выполняющую критичную к скорости часть - почему нет

    зы. лучше всего на android функционал покрыт java фреймоврками, соответственно и разрабатывать лучше/легче на java а точнее под виртуальную машину dalvik virtual machine (это машина исполнения скомпилированного кода java, можно найти компиляторы из других языков но красивая поддержка только у java)
    Ответ написан
  • Майнкрафт Forge+Spigot, MC1.16.4?

    @rPman
    Это так сложно, написать в гугл Bukkit или Spigot?

    https://www.spigotmc.org/wiki/buildtools/
    Ответ написан
  • Можно ли создавать моды для собственного сервера minecraft с помощью ЯП Python?

    @rPman
    Теоретически это возможно, есть компилятор jython с питона в jvm, но возни у вас с биндингами будет столько что слез на пару озер хватит.
    Ответ написан
    Комментировать
  • Как законно организовать прием игровой валюты?

    @rPman
    Сделав промежуточную валюту (кристаллы покупаемые за рубли, а уже за них идет покупка услуг внутри игры) позволит сделать более гибкую внутреннюю экономику, без оглядки на законодательство... например можно позволить игрокам торговать за нее внутри игры, когда как выход из игры в рублевую для игроков сопряжен с огромными проблемами (кстати если игроки сами между собой будут заниматься торговлей за рубли, к вам претензий не будет, хотя судя по тому что крупные компании как то с этим борются, значит претензии у налоговой возникают).
    Ответ написан
  • Создание многопользовательского сервера на го?

    @rPman
    Вне зависимости от выбора языка необходимо решить важные проблемы и выбрать решение, на практике есть два подхода к созданию игры:
    1. игровой цикл запускается на клиентах, сервер выступает как управляющий, синхронизирует и валидирует данные от клиентов. Куча проблем из-за рассинхронизации (колбасящий туда сюда персонаж) но зато 'приятный' реалтайм (это иллюзия, лаги просто маскируются)
    2. игровой цикл запускается на сервере, клиенты подключаются и запрашивают как мир выглядит в текущий момент. Это лагучий вариант (не подходит к динамичным играм) но никаких проблем синхронизации

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

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

    На практике многие разработчики плюют на валидацию, пишут как получится (к примеру берут синглпеерный движок который ничего не проверяет типа старый unreal engine, пилят на его основе AAA MMRPG а потом получают читеров, которые кастуют любые скилы любым классом или летают или проходят сквозь стены и т.п.)
    Ответ написан
    Комментировать