Ответы пользователя по тегу Разработка игр
  • Каков смысл скалярного произведения в Cel Shading?

    @Mercury13
    Программист на «си с крестами» и не только
    Отвечу по существу.

    У нормали длина всегда 1. Иногда это реально вектор, перпендикулярный к полигону — если мы хотим осветить плоский полигон как плоскость. Иногда мы хотим из плоских полигонов создать впечатление криволинейной поверхности и потому делаем (например, интерполяцией или специальной текстурой, т.н. картой нормалей) непрерывное поле нормалей.

    Вектор луча — это единичный (или той длины, какой хочешь) вектор, идущий от источника света к той точке, с которой работаем. (Ну или наоборот, смотря как формула записана.)

    Если длина вектора луча тоже 1 — то результат будет [−1…1]. Если он меньше 0 (в случае, если нормаль наружная, а луч идёт от источника света) — перед нами коэффициент, во сколько раз реальная освещённость меньше, чем обеспечиваемая источником света. Если больше — поверхность в собственной тени. (Расчёт падающих теней — отдельный и сложный вопрос.)

    С цел-шейдингом никак это не связано, это вообще база по освещению.
    Ответ написан
  • Столкнулся с проблемой парсинга заголовка wav звука?

    @Mercury13 Куратор тега C++
    Программист на «си с крестами» и не только
    Пропускать «левые» блоки, пока не дойдём до data! Что ещё делать?
    У меня получился файл длиной 5.241.822, и там такие блоки: по смещению 0C fmt длиной 0x10, по смещению 24=0C+8+10 LIST длиной AA, и по смещению D6=24+8+AA будет нужная нам data.

    Уточню, что я имел в виду. RIFF — это стандартный блочный формат, не ограничивающийся WAV’ом. Допустим, есть формат RMI = RIFF MIDI. Ваше решение подразумевает, что за блоком «fmt» сразу идёт блок «data», что не всегда верно.

    Ещё раз, мужик! По смещению 0C будет блок «fmt»: 4 байта сигнатура, 4 байта длина и 0x10 байт данные.
    За этими 0x10 байтами, по смещению 24=0C+8+10, идёт блок LIST: 4 байта сигнатура, 4 байта длина и 0xAA байт данные. Блок не наш — пропускаем эти байты, и переходим сразу на смещение 0xD6=24+8+AA. Там 4 байта сигнатура, 4 байта длина и 0x4FFB00 байт данные. Их-то и читаем.
    Ответ написан
  • Можно ли выкладывать на вики сканы карт из настольной игры или хотя бы текст с карт?

    @Mercury13
    Программист на «си с крестами» и не только
    Это находится в «серой зоне» и зависит от «борзости» издателя. По авторским правам это чистое «добросовестное пользование несвободного контента», которое определяется исключительно судом (нет чётких критериев), и если издателю захочется закрыть — закроет. Пара советов.
    1. Ставьте такое качество, чтобы текст едва читался.
    2. Использование каждой несвободной картинки должно быть обосновано.
    Ответ написан
  • Как договорится с художником и какие есть лицензии у изображений?

    @Mercury13
    Программист на «си с крестами» и не только
    На вопрос 2 — из некоммерческих годятся общественное достояние (Public domain = PD = CC0) и «укажи автора» (Creative Commons Attribution = CC-BY). Никакие другие лицензии CC для коммерческой игры не годятся!

    Если игра открытая — подумай, под какой лицензией она будет выпущена и совместимы ли требования с этой лицензией. Например, с GPL совместимы PD = CC0, CC-BY, CC-BY-SA.

    Разумеется, возможна ситуация, что одни части игры под одной лицензией, другие — под другой. Например, движок GPL-ный, а изображения под более строгой или более мягкой лицензией. Так, Doom (1993) имеет GPL-ный движок и коммерческое всё остальное.

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

    Если лицензий несколько (например, CC-BY + GPL2 + GPL3) — если среди них есть хоть одна, которая тебя устраивает, порядок!
    Ответ написан
  • Какая графика используется в игровых движках?(вектор или растр.)И как вообще устроен графический редактор в них?

    @Mercury13
    Программист на «си с крестами» и не только
    Трёхмерная графика не бывает векторной и растровой. У неё там свои разновидности, и там она используется полигональная. Текстуры, разумеется, растровые. Существуют псевдовекторные элементы вроде поля расстояний, но это именно что «псевдо-».

    Двухмерная — в подавляющем большинстве случаев растровая, но и векторные элементы бывают.
    Ответ написан
  • Старые игровые движки и их строение?

    @Mercury13
    Программист на «си с крестами» и не только
    Нашёл вот такую книгу.
    gamesmaker.ru/books/kak-samomu-sozdat-trehmernuyu-igru
    Вроде она.
    Ответ написан
  • Что делать при несовпадении координат на клиенте и сервере?

    @Mercury13
    Программист на «си с крестами» и не только
    Я об играх, где игрок управляет одним объектом: шутерах, гонках…
    Клиент и сервер держат несколько исторических положений.

    Координаты СЕБЯ, ЛЮБИМОГО — клиентские. Если серверные координаты в такт 1234 не совпадают с нашими — откатываемся к серверным, повторно прокрутив нужное количество тактов управления.
    Вещи неуправляемые/слабоуправляемые, вроде запаса жизни, берутся подтверждённые сервером.

    Координаты ВРАГОВ — серверные (возможно, каким-то образом экстраполированные).

    Для физики пуль пишется т.н. «компенсация пинга»: если клиент пишет, что в такт 1234 он стреляет, сервер восстанавливает, что КЛИЕНТ ВИДЕЛ в такт 1234, и сравнивает попадание именно с ТЕМ положением клиента. Для медленных снарядов компенсация обычно не пишется.
    Ответ написан
  • Как программировать игру в игре?

    @Mercury13
    Программист на «си с крестами» и не только
    Обычно для этого используют скриптовый движок. Наиболее известный — Lua.

    Также используют триггеры, эталонный пример — StarCraft.
    Но, работая с триггерами, надо разделять «условие» и «повод». Повод — это событие-импульс, которое МОЖЕТ спровоцировать срабатывание триггера. Условия — это уже дополнительные вещи, которые проверяются потом.

    Третья возможность — движок, основанный на данных. Например, задаём тип атаки, количество HP, тип движения и прочее, и вся эта библиотека уже записана в коде. Эталонный пример — Doom (самый ещё первый, 1993 года). Кстати, в его последователе Hexen появились скрипты.
    Ответ написан
  • Как создать отличный сбалансированный уровень?

    @Mercury13
    Программист на «си с крестами» и не только
    https://www.youtube.com/watch?v=0xBJwrm9C8w
    https://www.gdcvault.com/play/1023139/Level-Design...

    https://www.rockpapershotgun.com/2015/01/22/how-to...

    https://www.gamasutra.com/blogs/AsherEinhorn/20150...

    Есть ещё книга «Fundamentals of puzzle and casual game design», но я её пока не видел в лицо.

    И без бета-тестеров никуда. Сам не делал уровни, но один знакомый нарисовал немаленький мод к Braid — бета-тестерами служили его отец и я.

    Вот ещё нашёл по Braid: gamedesignreviews.com/reviews/braid-understanding-...
    Ответ написан
  • Как продумать геймплей, чтобы он был завлекающий и сбалансированный?

    @Mercury13
    Программист на «си с крестами» и не только
    К сожалению, геймдизайн — это очень творческая профессия, и Extra Credits предупреждает: дизайн, базирующийся на собранных данных, не делает нового, он только оттачивает имеющееся.
    https://www.youtube.com/watch?v=nqGcXOksFGg

    Может быть, это вам и нужно — заработать побольше денег на клоне Dota (PUBG, Candy Crush, Angry Birds). Но про творчество попытаюсь рассказать.

    1. Ходите на художественные выставки.
    2. Играйте во что угодно, впрочем, необычным образом. Во-первых, играйте не только в любимые жанры, но и в файтинги, RPG, симуляторы и прочее. Во-вторых, часто хватит потратить на игру четыре-пять часов. В-третьих, прикарманивайте их решения. В четвёртых, ищите поломы системные (например, где-то ∞ денег) и поломы отдельной подсистемы (застревающая камера). Намеренные ли эти поломы? Мешают ли играть?
    Ответ написан
  • HTML5 game | Как убрать задержку клавиатуры после первого нажатия клавиши?

    @Mercury13
    Программист на «си с крестами» и не только
    Если игрок управляет дискретным курсором или маркером, например, в сапёре или пасьянсе (если те играются с клавиатуры, разумеется) — так и надо, нужен системный автоповтор клавиш.

    Если игрок управляет непрерывно движущимся персонажем, надо отойти от системных автоповторов и сделать две независимых подсистемы.
    • Подсистема реагирования на клавиатуру. При нажатии на кнопку системный код превращается в виртуальную клавишу (например, «Идти вверх», «Выстрел» или «Бомба»). Затем в битовой маске управления в соответствующей позиции ставится 1. При отпускании — соответственно 0.
    • Подсистема тактов игры. По таймеру проводится такт игры — акт управления всеми её персонажами, главным и врагами. В зависимости от состояния клавиш мы ведём Главного в ту или иную сторону.
    • Третья подсистема — рендерер игры. Она может быть синхронной с тактами игры или нет, в зависимости от того, какое мы хотим поведение на слабых машинах и есть ли желание проработать асинхронщину (не обязательно многопоточную; например, рендерер может поминутно вызывать «прокрути такт игры, если надо»). А также звук и сеть — в нашем вопросе, впрочем, не до них (и вообще рендерингом занимается браузер).

    Если тактовая частота игры невелика (скажем, до 16) и приходится подгонять героя «на один шажок», у меня есть маленький лайфхак, оставшийся с J2ME. Создаём две маски: «нажатая» и «удерживаемая».
    • При нажатии: поставить 1 в обе маски.
    • При отпускании: поставить 0 только в удерживаемую.
    • При управлении героем: нажатая := нажатая OR удерживаемая; именно по этой «нажатой» управляем героем; нажатая := 0.

    С новым годом, и хороших игр!
    Ответ написан
  • Где найти новые детерминированные игры с полной информацией?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть разумеется.
    18 век: https://en.wikipedia.org/wiki/Agon_(game)
    19 век: https://ru.wikipedia.org/wiki/Реверси
    20 век: https://ru.wikipedia.org/wiki/Перебрось_мостик
    20 век: https://ru.wikipedia.org/wiki/Гекс
    20 век: https://en.wikipedia.org/wiki/Quoridor
    21 век: https://ru.wikipedia.org/wiki/Улей_(игра)
    21 век: https://ru.wikipedia.org/wiki/Khet

    Почему таких игр крайне мало?
    1. Мы автоматически отбрасываем часть позиций как неперспективные — потому, чтобы обеспечить ту же просчитываемость, ДИсПИ должна быть намного богаче тайной или случайной. Некоторые механики придётся отбросить, поскольку, например, заимствованием стратегии доказывается, что первый выигрывает.
    2. Из двух игроков разной силы один выигрывает с вероятностью, стремящейся к 100%, игра быстро теряет интерес. А ведь как важен такой интерес для новой игры, которая пока продвигается…
    3. Продвигается исключительно гиками: сложно сыграть, например, папе с дочкой.
    UPD. 4. Крайне сложно сделать, чтобы компьютер косплеил человека. Другими словами, совершал ошибки, свойственные человеку, и при попытках подловить тупой алгоритм ходил как угодно, лишь бы по-другому.

    А насчёт шахмат — от первых упоминаний до современных правил прошло тысячелетие! Догадываетесь, какие плейтесты они прошли, чтобы из банального варгейма стать тем, чем они являются сейчас (хотя тоже, по всей видимости, были популярны в первую очередь у верхушки общества).
    Ответ написан
  • Header в header'е и можно ли делать игру на одних Header'ах?

    @Mercury13 Куратор тега C++
    Программист на «си с крестами» и не только
    Такой механизм называется «одна единица компиляции» и вполне имеет право на жизнь: на одном процессоре время полной сборки будет наименьшим, потому так распространяют некоторые библиотеки (SqLite, Google Test). Правда,
    игра — обычно масштабный проект, и чем больше будет кода, тем дольше нужно компилировать, чтобы проверить изменения.

    Потому код обычно разбрасывают по единицам компиляции (*.cpp) в соответствии с его внутренней логикой, и к каждой единице (кроме точки входа) приписывают хедер (*.h), который показывает, что эта единица делает. Повторяю, только описывает, что делает — весь код в CPP. И в большинстве случаев самый длинный этап сборки — линковка (особенно с оптимизацией по ходу линковки aka LTO).

    Единственное, что в 80% случаев не получается закинуть в CPP — это шаблоны.

    Чтобы один хедер не подключался несколько раз — есть include guard. Правда, если вы не продумали зависимость между хедерами, может попасться циклическое включение — это вредно, но лишь потому, что программа может не скомпилироваться.

    Чтобы не было циклических включений, для сохранения скорее всего потребуются два хедера: один отвечает за собственно процедуру сохранения и подключается к одному-единственному модулю — системе меню. Второй — за какие-то общие функции, которые позволяют сохраняться в абстрактный поток плиточному фону, снаряду, монстру… Называется как-нибудь SaveUtils.h и подключается повсюду.

    (Примечание. И SqLite, и Google Test разрабатывались по традиционной схеме, с проектом из кучи CPP. SqLite собирается в один большой *.c автоматикой, и я даже качал традиционный код — на 5-метровом файле некоторые версии Embarcadero вылетали с нехваткой памяти. В Google Test есть файл all.cpp или что-то подобное, в котором #include остальных CPP — пользователь подключает в проект all.cpp, и библиотека отнимает минимум его времени.
    Ответ написан
  • Реально ли 2d игра на С++ без граф.библиотек и движокв?

    @Mercury13 Куратор тега C++
    Программист на «си с крестами» и не только
    Без DirectX или OpenGL никуды, это самые низкоуровневые API, дающие как скорость, так и мало-мальскую совместимость.
    Советую использовать тонкую обёртку над всем этим добром вроде SDL: думаю, интереснее будет писать игру, чем решать проблемы с Alt-Tab.
    А так, если задаться целью, можно небольшой движок сделать за неделю-две. Остальное лучше оставить на багофиксы и наполнение.
    Не советую работать с гексами, и вот почему. Гексы сразу же подразумевают, что игра пошаговая. ИИ замучитесь писать!

    И ещё. Систему анимации-то можно за это время написать, но сделать хороший редактор анимаций сложнее. Каждый кадр — отдельная картинка, и всё?
    Ответ написан
  • Что использовать, int, float или double в современном игровом движке?

    @Mercury13
    Программист на «си с крестами» и не только
    Предварительные расчёты (например, координаты моделей) проводить в типе достаточной точности (и, разумеется, на процессоре). Окончательные — в привычном float.
    И, понятное дело, для открытых миров придётся писать свои «велосипеды» по отсечению далёких горизонтов, и Unity в стандартной поставке не уверен, что подойдёт.

    Ещё раз. Координаты участников игры записываются в double. Координаты вершин модели — во float. Мы на процессоре проводим начальные преобразования координат, убеждаемся, что координаты заслуживают того, чтобы их рендерить, преобразуем во float и гоним на видяху.
    Ответ написан
  • Как написать структура классов платформера?

    @Mercury13 Куратор тега C++
    Программист на «си с крестами» и не только
    1. Перед нами серьёзный проект: есть и сеть, и подкачка, и поиск путей. Если вы будете писать платформер с нуля, вероятно, «лишние» компоненты вы писать не будете.
    2. Это компоненты, а не классы. Структура классов в геймплее будет более густая, а в рендеринге и физике — менее.
    Например, пишем 2D-рендеринг. Я бы делал Renderer, Tileset, TileLayer, Sprite, Particle…

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

    @Mercury13
    Программист на «си с крестами» и не только
    Да, это называется игровой баланс. Дело сложное и мутное, единого подхода нет.

    Рубиться компьютер на компьютер — помогает в маргинальных случаях и свидетельствует о бедном геймплее. Сложных героев наподобие Ио или Оракула из Доты попробуй отработай. (Хотя все последние герои сложные, начиналось всё ≈2007 с героев поддержки, но потом всяких наделали: и танков, и дамагеров.)

    Все начальные подсчёты приблизительные, и примерно такие.

    Вот у нас есть гипотетическая Лунная Наездница, которая не имеет длительных дисейблов (зато догонит почти любого), каждые 6 секунд даёт магию на 250hp и раз в секунду даёт удар на 50hp. Вот и получается: за кулдаун нюка она сносит 300 hp. Другими словами, больше урона она наносит руками, чем магией. Сколько должен наносить гипотетический Гном-снайпер, который вообще не имеет магии и бьёт только своим ружьём (с такой же скоростью)? Получается, что 90hp. Многовато, но можно дать Снайперу фору другими методами. Поскольку первые уровни Доты — это «перестрелка на Угре» из-за спин крипов, можно дать ему большую дальность, и он зачморит Наездницу. Можно дать подствольник, который будет эффективен против крипов с первых же уровней.

    Особые сложности начинаются, когда в игру входят полубоевые персонажи (дисейблеры, киллеры и прочие). Один держит, второй палит — сколько секунд держать? И, считаю, только под Valve решились основные косяки с Дотой.

    Поскольку игра длится в пространстве и времени, надо понимать, как та или иная местность, тот или иной этап игры помогает тому или иному герою. Сможет ли игрок выстоять «не в своей тарелке» и пережить чужой «золотой век»? Какие нужно для этого принять решения? Это больше творчество, чем наука.

    Но прежде, чем собирать баланс, надо… 1) Собрать приблизительное видение игры; 2) Сделать прототип; 3) Собрать общую картину баланса — и только тогда можно раздавать характеристики разным персонажам.
    Ответ написан
  • Как нарисовать изгиб мостика под нагрузкой?

    @Mercury13
    Программист на «си с крестами» и не только
    В первом приближении (деформации малы, балка лёгкая) — половина параболы.
    Если точно — решить можно только численно.
    Ответ написан
  • Есть ли игры в открытом мире с круглой землей (картой)?

    @Mercury13 Куратор тега C++
    Программист на «си с крестами» и не только
    В первую очередь авиасимуляторы. Знаю, что из-за масштабов Земли им приходится справляться с ошибками float: если Земля 12000 км в поперечнике, то единица младшего разряда — полметра.
    Первый X-COM имел круглую землю, но полёты были по локсодроме. А вот в опенсорсном ремейке 2014 года полёты уже по большому кругу.
    Симуляторы бога от Питера Молиньё: Populous, Black and White. Возможно, и другие симуляторы богов (например, Spore — не проверял).

    Я говорю именно про шарообразную карту, а не трубу/тор.

    А так — я бы предостерёг от шарообразной земли с открытым миром. 1) Расстояния (глобальная карта с ускоренным временем или без времени не в счёт). 2) Навигация по миру (в том числе понятие «север»), проекция миникарты. 3) В какой-то момент нужно закругляться и выкатывать игру, а в какой-то — выдавать аддон. Тяжеловато будет. Кстати, во всех упомянутых играх мир или замкнутый, или намного больше, чем одна планета.

    P.S. Моё определение открытого мира: игра, дающая относительную свободу действий и передвижения, но локальный участок, где орудует игрок/группа, намного меньше мира. В замкнутом мире, наоборот, участник орудует практически по всему «миру», оперативно переходя с одного участка на другой. Есть и пограничные случаи: огромное побережье нового Hitman — открытый мир или замкнутый?
    Ответ написан
  • Почему единицы измерения разрешений экранов мониторов и смартфонов разные?

    @Mercury13
    Программист на «си с крестами» и не только
    > но этот экран в 10 раз меньше экрана моего ноутбука
    Если только по площади — если пропорции сходные, 15" больше 5,5" в 7,43 раза.

    И там, и тут единицы измерения — пиксели. Просто у смартфонов больше пикселей на дюйм.
    Почему так?
    • Мы смотрим на экран с меньшего расстояния.
    • Смартфонные API молоды и потому изначально рассчитывались на переменный DPI. Имеющиеся программы не пострадают.
    • И в то же время из-за маленьких экранов и больших пальцев плотная компоновка элементов управления не требуется.
    • Видимо, HiDPI-экран настольных размеров без битых пикселей будет стоить запредельно дорого.

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