Исповедь начинающего геймдевелопера.

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 17 ноя 2016, 09:08

aspid писал(а): Система управления отдельно каждой частью тела в пошаговом режиме тоже непонятно))
То есть я, вместо того, чтобы нажать стрелочку "вверх" и походить на север, а вторым ходом ударить противника (тоже стрелочкой "вверх" если противник через клетку на севере от меня) должен в первый ход отдать приказ ногам идти на север, а рукам - замахиваться в том же направлении? Это не слишком сложно будет?
Хороший вопрос) Скорее всего, так и будет. Представил себе mount and blade в roguelike стиле).
Зато, видя что противник поступает так же (в логе пишет "Темный лорд в доспехах взносит над собой двуручный топор и движется в вашу сторону!") есть возможность оценить ситуацию.
Я еще не до конца уверен, стоит ли делать разделение процесса удара на замах и собственно сам удар. Возможно, лучше убрать такое разделение, но тогда само действие удара можно начать только встав на соседнюю клетку. И уже пока идет процесс удара, в зависимости от того, насколько продвинулся прогресс, писать про Темного лорда и его двуручный топор :) К примеру, противник завершил удар на 30%, пишется о том, что топор вот-вот обрушится тебе на голову, а твой персонаж, если ноги не заняты, убегает на соседнюю клетку в это время или ввести специальное действие ногам (отскок), в то время как противник уже совершает удар. Можно даже сделать так, чтобы после определенного процента ни прервать процесс, ни откатить его не получится - топор уже летит вниз, в то время как ты уже заканчиваешь отскок и готовишь свой ответный удар.
Сложность безусловно в игре будет, в плане геймплея) Эта цена за большу'ю свободу действий. Примерно, как в DF цена за проработку мира - неинтуитивный и сложный интерфейс. Но, скорее всего бои будут проходить не слишком долго, до первого серьезного попадания.
Насчет демки - пока штудирую разные алгоритмы FOV... Будет, наверное, не скоро. :( Возможно, напишу простой FOV по Брезенхему, от персонажа до границы обзора в определенном конусе обзор. Если получится, то уменьшая видимость от расстояния и отклонения от угла зрения. Смотрю еще в сторону recursive shadowcasting, он лучше в плане производительности, как я понял, и результат неплохой, но его сути я пока догнать не могу) Плюс еще в том, что угол обзора обсчитывать не так затратно, как по всему кругу. В recursive shadowcasting будет использоваться только 4 октанта -- угол обзора человеческого глаза меньше 180 градусов. Не беру пока в рассмотрение возможных персонажей с глазами сзади :). Где-то меньше половины круга самое то -- примерный угол обзора человека по горизонтали. Пока не буду затрагивать 3D FOV - слишком сложно для меня... Пока все в 2Д.
Стоит только захотеть...

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Исповедь начинающего геймдевелопера.

Сообщение Oreyn » 17 ноя 2016, 12:31

BreakMT писал(а):А что за проект можно узнать?
Нет =). Я понимаю твои интерес в плане - покажи я тоже хочу свой доход. Собственно мои вкусы очень специфичны. Это эдалт игра под андроид со сбором доната через Петреон.
Прямую ссылку на проект давать не буду, там цифры, да и моя аудитория по ту сторону океана. В наших краях, где социализм отпечатал тавро в душах, донатить это что-то вроде быть лохом. Patreon.com - платформа для краудфандинга. Собсно там полно примеров проектов и по гейм девелопменту, и по арту и по чему хош. Ну вот кстати тот же Тарн Адамс - https://www.patreon.com/bay12games
kipar писал(а):5. Имхо одна из главных проблем - если продумывание уходит далеко от реализации. Тогда реализовывать основы хотя уже продумал дальние горизонты неинтересно, соответственно проект провален. Поэтому стараюсь находить некий баланс между продумыванием и реализацией, не продумывать дальше пока не реализовал предыдущее. Ну и вторая проблема - если надолго бросить по каким-то причинам, то есть некоторое сопротивление при возвращении к проекту, выходишь из настроя и обнаруживаешь кучу недостатков, поэтому лучше не отвлекаться.
Ага, тебе хочеться пилить АИ и хитрые взаимодействия с миром. А тебе нужно делать инвентарь и прочее.
Верно подмечено.

2 Loinon
Почитал твой диз док по оглавлениям. И меня как прошибло. Я когда-то писал такой-же док и даже статы было расписаны =) Угадай как все закончилось. И это было еще до того проекта, который я довел до бегательной демки.
Вот так без скилов и опыта, со сниманием чехлов с фова, движка походового, управление памятью, структура игровых объектов - 100 часов минимум. Просто знай, чтобы быть готовым. И это еще до всякого "харизма вляет на цены в магазине". О чем и писал kipar.

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 17 ноя 2016, 12:42

Oreyn писал(а): Почитал твой диз док по оглавлениям. И меня как прошибло. Я когда-то писал такой-же док и даже статы было расписаны =) Угадай как все закончилось. И это было еще до того проекта, который я довел до бегательной демки.
Вот так без скилов и опыта, со сниманием чехлов с фова, движка походового, управление памятью, структура игровых объектов - 100 часов минимум. Просто знай, чтобы быть готовым. И это еще до всякого "харизма вляет на цены в магазине". О чем и писал kipar.
Понимаю ваше скептическое отношение) Не так уж все и плохо со скилом и опытом. Скиллов не хватало в плане того, как довести до конца игрульку. Помимо этого проекта было много попыток других, оттуда более менее опыт есть... С фовом уже более менее разобрался, в с# управлением памяти занимается автосборщик мусора, структура игровых объектов - это будущая проблема, но тоже решаемая.
Что вы имели ввиду под "походовым движком"?
Да, с диз. доком я переписал больше, чем нужно на нынешний момент, увлекся) Приятно иметь игру, пусть даже на бумаге :D Сейчас буду пилить прототип, основы основ.
Последний раз редактировалось Loinon 17 ноя 2016, 21:01, всего редактировалось 1 раз.
Стоит только захотеть...

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 17 ноя 2016, 15:36

Залил свой первый октант : ) Работает пока довольно криво, но первые шаги уже есть. буду исправлять...
Скрытый текст: ПОКАЗАТЬ
Изображение
Стоит только захотеть...

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 17 ноя 2016, 20:30

Потихоньку подхожу к нужному результату, убил день, но вроде получается) Осталось сделать более плавные края, как от алгоритма Ву, при пересечении с препятствием. И перенести все на другие октанты. И оптимизировать. И... дохера дел короче -_-
Скрытый текст: ПОКАЗАТЬ
Изображение
Очень хочу получить подобное:
https://www.youtube.com/watch?v=Z4uijn3M4VQ
Стоит только захотеть...

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Исповедь начинающего геймдевелопера.

Сообщение kipar » 18 ноя 2016, 13:57

На ютубе же ссылка на исходник. Бери да копируй.

Аватара пользователя
Apromix
Мастер
Сообщения: 1236
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: Исповедь начинающего геймдевелопера.

Сообщение Apromix » 18 ноя 2016, 14:19

Есть либа BeaRLibFOV для FOV'ва. Если не хватает функционала FOv'а, можешь заказать необходимое у автора либы.

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 18 ноя 2016, 14:46

Ссылка на исходник есть, я видел. Я пишу на C#, с C, к сожалению, особо не дружу( Переносить и разбираться в чужом коде (который еще без комментариев совершенно), написанном на чужом языке,займет больше времени, чем написать свое, но я периодически заглядываю покопаться в исходниках. Возможно, у меня немного NIH-синдром... Да и интерес разобраться, как работает алгоритм есть.
Насчет BearLibFov... Я рассматривал такой вариант и много прочитал оттуда. В исходниках Cfyz я тоже немного копался. Но не уверен, что мне достает опыта как-то сделать враппер для шарпа. Там помимо этого еще BearLibMap нужен, а значит, враппер и для него (наверное). Я не шибко шарю в том, как использовать неуправляемый код в Net'e...
Необходимые требования к FOV такие:
Возможность получать степень обзора клетки, т.е. на сколько клетка видна, а на сколько закрыта (дробное число от 0 до 1)
Возможность задавать радиус обзора. Причем желательно не в целом числе. Если радиус 2.5, тo видимость третьих клеток умножается на (дистанция до центра клетки минус радиус). И задавать направление обзора.
Возможность настройки обзора в зависимости от расстояния.
Возможность задавать градиент обзора от главной оси конуса обзора к его края.
Не уверен, что могу просить этого у кого-то. Тем более, если я не ошибаюсь, Александр временно забросил развитие FOV) Поэтому, катаюсь на своем велосипеде.
Последний раз редактировалось Loinon 19 ноя 2016, 20:16, всего редактировалось 2 раза.
Стоит только захотеть...

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 19 ноя 2016, 15:13

Итак, я вроде бы сделал чертово сглаживание, которое помотало мне нервы, но дало хороший опыт. В ообщем и целом, выглядит это так:
Скрытый текст: ПОКАЗАТЬ
Изображение
Еще есть, что нужно поправить. Можно было сделать лучше, но не уверен, что это так необходимо. В частности, иногда линия границы тени с видимой областью перекрывает некоторые клетки, для которых видимость не рассчитывается: нужно отходить от полностью закрытых клеток на две клетки и для каждой рассчитывать видимость. Пока что рассчитывается видимость соседней клетки, которая полностью перекрывается тенью.
Сложность еще в том, метод рекурсивный, и когда следующей строке выше нужно что-то передать (например, интенсивность у "пограничной" клетки), метод довольно быстро распухает. Это в принципе решаемо, если сделать какой-нибудь класс "OctantData".
Есть еще один некритичный и редкий, но нелицеприятный артефакт, когда в некоторых случаях граничные клетки от одной тени совмещаются с границей тени от другого предмета. Клетка в этих случаях становится слишком светлой.
Скрытый текст: ПОКАЗАТЬ
Изображение
Если честно, немного боюсь отзеркаливать и переносить на другие октанты, чтобы не сломать основу. Хотя, и не уверен, что необходимо все считать через один метод - читабельность кода опустится ниже плинтуса. Поэтому на первое время буду тупо копипастить код 7 раз под каждый октант, называя как нужно переменные, чтобы не запутаться) Потом - может быть объединю методы. Если кто имеет в этом опыт - напишите пожалуйста в личку :)
Соберу этот FOV и начну со второй основной сложностью - системы управления персонажем. Скорее всего, буду вести здесь что-то вроде журнала разработок до тех пор, пока не получу демку (не хватит терпения доделать демку == не хватит на весь проект). Потом создам отдельную тему...
UPD: Понял в чем причина бага. Можно было найти такое положение, при котором "стартовый" наклон был больше "последнего"
UPD2: Исправил.
Стоит только захотеть...

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Исповедь начинающего геймдевелопера.

Сообщение Максим Кич » 19 ноя 2016, 19:46

Не надо бояться делать «системные» части кода «нечитабельными». Всё равно никто туда заглядывать не будет. Никогда. Вещи вроде FOV лучше всего отладить один раз, оптимизировать в разумных пределах (т.е. элементарные вещи вроде выноса за пределы циклов того, что можно вынести) и забыть о них навечно.

FOV, pathfinding и проч — должны во-первых, работать, во-вторых работать быстро. Там по определению будет мясо, это практически неизбежно. Все эти адовые клоаки должны предоставлять внятный интерфейс для прикладной части и на этом их дружелюбность к человеку может быть исчерпана.

Вот в «прикладной» части программы, которая будет изменяться часто и разрастаться вместе с проектом, читаемость нужна и тут можно ради неё до определённой степени пренебречь оптимальностью.
Dump the screen? [y/n]

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 20 ноя 2016, 00:49

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

Аватара пользователя
Loinon
Сообщения: 43
Зарегистрирован: 19 июл 2016, 18:20

Re: Исповедь начинающего геймдевелопера.

Сообщение Loinon » 20 ноя 2016, 20:43

Как-то через хитро выкрученную з***ницу, но алгоритм работает. Смог перенести на верх и низ. Остались правая и левая стороны. И тут есть некоторая сложность. Сканирование пока идет строка за строкой (по у), слева направо (по x). Как переносить направо и влево я не знаю, очень много параметров придется подкручивать :( там и так всякие абстрактные hSign, vSign. Скорее всего, буду отдельно делать метод для скана снизу вверх для правой и левой части круга, столбец за столбцом, вынеся предварительно общие вещи в отдельные методы.
В основном же результат меня радует, все почти как на видео. Забавно вертеть линейкой у монитора, чтобы убедится, что все считается верно :) Времени занимает все это дело довольно много (писал часов 20-25), но результат мотивирует.
Если говорить о цифрах, то на карте с размером 100 на 100, радиусом 50 и стенами в кол-ве 200 штук, на 4 октанта приходится 4-5мс (intel core i5-4460S). Беря в расчет другие октанты, умножаем на 2 и получаем 8-10мс. В общем, результат неплохой, как мне кажется. Это на целый круг, игра же будет считать fov для ГГ, у которого радиус и угол обзора будет ограничен.
Еще нужно будет настраивать внешний основной метод CalсFov для возможности задавать угол и направление взгляда. Но это будет не настолько сложно (наверное), как пилить алгоритм: просто посчитать, какие октанты будут задействованы и послать им нужные параметры. Насчет градиента от направления обзора к краям конуса обзора пока не уверен, вроде реализация сложной быть не должна, но это второстепенная задача - получится - хорошо, не получится - ну и хер с ним. Скорее всего, расчет будет производится со стороны класса игрока (можно даже привязать какой-нибудь параметр внимательности к этому). Радиус уже настроен и корректно работает, задавать можно и double значение. например, 0.5 будет показывать только центральную клетку, а 1.5 - центральную и половину видимости тайлов вокруг. Условия выхода за границы тоже введены.
Смотреть через диагональные клетки нельзя, считается: что стены занимают клетку полностью.
Скрытый текст: ПОКАЗАТЬ
Из будущих идей:
1) Ввести возможность прозрачности объектов. Пока расчет ведется только для полностью непрозрачных объектов. Учитывая специфику алгоритма, ввести эти будет, как мне кажется, несколько проблематично, но если пораскинуть мозгами - можно. Пока не уверен, что это мне будет необходимо. Еще нужно будет подумать над тем, как будет игровое освещение и видимость корректировать друг друга. Два эти параметра - double значения от 0 до 1, и их перемножение даст еще меньший результат. Пока рано об этом думать: скорее всего, расчет общей видимости с учетом освещенности будет лежать на методах карты - так логичнее.
2) Пока что тени отбрасываются по углам клеток (+-0.5 от центра стены по x или y - в зависимости от октанта).
Можно было бы у карты запрашивать размеры непрозрачного предмета (например дерево занимает не всю клетку, а 0.5 от ее ширины) и тогда отсчитывать не по 0.5, а по 0.25 от центра. Даже можно было бы позицию непрозрачного предмета ввести относительно центра клетки. Выглядело бы красиво, учитывая что BearLibTerminal позволяет делать смещение относительно центра клетки. Но это уже перебор, как мне кажется - персонаж может находится только в центре, а предметы где угодно :) Чем дальше игра уходит дискретности, тем сложнее представлять игру в жестоком, беспощадном дискретном мире.
3) Еще нужно дать возможность внешнему коду задавать свою формулу для расчета видимости от дистанции.
Скорее всего, на некоторое время отойду от дел: учеба не дремлет).
Ну и на вкусное - скрин текущего FOV.
Скрытый текст: ПОКАЗАТЬ
Изображение
И побольше.
Скрытый текст: ПОКАЗАТЬ
Изображение
Стоит только захотеть...

Аватара пользователя
Artorias
Сообщения: 561
Зарегистрирован: 01 окт 2014, 23:13

Re: Исповедь начинающего геймдевелопера.

Сообщение Artorias » 21 ноя 2016, 12:40

С опозданием выскажусь по первому посту. Еще не читал остальных постеров, поэтому могут быть баяны.
Скрытый текст: ПОКАЗАТЬ
(Оговорюсь, что у меня также нет проектов причастных к рогаликам, а завершенный был из разряда черновых.)

1) Без диздока ты не сможешь коррелировать и удерживать в памяти солидные объемы данных. Разработка будет постоянно буксовать и в конечном счёте сорвётся. Если не хочется продираться сквозь нагромождения текста и пол-дня ждать прогрузки документов - лучше выбросить гугл докс и поискать более подходящую альтернативу для создания игровых баз. Под свои нужды не нашел ничего практичнее Scrivener'а. Все остальные инструменты показалось вязкой, тяжеловесной гадостью.

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

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

3) На 50% процентов творчество, на 50% - желание заработать. К нормальной работе ни характер ни перспективы не располагают.

4) В очень скромной команде.

5) Готовых постулатов нет, т.к бросить никогда не поздно. Можно создавать базы и контент в порядке возрастающей сложности; проявлять нездоровую дотошность во всём. Это подведёт тебя к черте невозврата. Оценка проделанной работы хорошо подстегивает к ответственности и защищает от растерянности. Архитектурный вопрос был затронут в пункте 2. Каркас неизбежно меняется в течении всей разработки, следовательно наиболее сложные и изменчивые стороны игры лучше выстраивать из заглушек. К примеру, нет смысла преждевременно рисовать монстров и тайлы, часть из них в любом случае уйдет в утиль. Поэтому львиную долю времени на их месте должно стоять то, что полностью отражает представления и безжалостно заменяется: загугленная или вырезанная из левых источников графика, текстовые презентации механик.

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Исповедь начинающего геймдевелопера.

Сообщение Jesus05 » 21 ноя 2016, 13:00

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

Аватара пользователя
Artorias
Сообщения: 561
Зарегистрирован: 01 окт 2014, 23:13

Re: Исповедь начинающего геймдевелопера.

Сообщение Artorias » 21 ноя 2016, 14:02

2 Jesus
Возможно, причина в невыдержанных идеях, с неопределенным сроком жизни и поверхностной связью с твоей душевной организацией. Это всегда ненадёжный стройматериал для творчества. Они кажутся обманчиво идеальными пока не вырастаешь из них и не осознаешь, что отсылок во внутренний мир было не так-то много, а вместо них использовалось что-то ложное, подчинённое проходящему настроению. Идеям нужно время чтобы настояться и напитаться какими-то переживаниями. То есть, если что-то годами не вылезает из головы - это твоё, и его можно считать надежным заделом для творчества.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 39 гостей