Продолжаю работать над своей игрой [Part2]: тени, редактор, диалоги, etc

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

картинка-затравочка

Первая статья, кому интересно:

В самом конце поста есть кусок геймплея целиком. Если кому-то наскучит читать мои промежуточные приключения.

Тени

Итак, первое за что я решил взяться в продолжение своей разработки — тени. Мне казалось это будет очень весело и не особо затруднительно. Для начала решил просто сделать источник света, который будет давать какое-то подобие света вокру. Сказано — сделано. Было быстро и безболезненно.

-Тень. -Чернобыля? -... Ну типа.
-Тень. -Чернобыля? -... Ну типа.

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

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

Здесь я выставил детализацию теней на 4. это в 16 раз больше вычислений.
Здесь я выставил детализацию теней на 4. это в 16 раз больше вычислений.

К сожалению уже на этом этапе стало понятно, что мой алгоритм сжирает все ресурсы и выдаёт неутешительное количество кадров. Я пораскинул мозгами и решил писать вторую версию алгоритма. Раз у меня всё поделено на клетки, то и линии между двумя точками надо рисовать по клеткам, а не пикселям. Так можно здорово упростить себе жизнь. Потратив еще день на отладку своего алгоритма, я понял что нарисовать по пикселям линию между двумя точками не так просто. Но тут я наткнулся в интернете на Алгоритм Брезенхэма.

Задача, которую решает алгоритм Брезенхэма.

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

рейтрейсинг на минималках :)

Результат выглядит действительно забавно: тени, полутени, освещение от нескольких источников. Однако, учитывая не не самое «динамическое» обновление теней, я всё же решил забить и не продолжать колупаться с этим. Единственное, что я оставил, это «запекание» теней для неподвижных объектов после перехода игрока на уровень. Игрок, ящики и прочеие подвижные объекты теперь не отбрасывают тени, но это лучше, чем вообще без освещения.

Реалтайм и плавные перемещения

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

К реалтайму добавил так же плавность перемещения игрока и объектов. Если раньше всё перемещалось мгновенно, то теперь визуально игрок «пертекает» из клетки в клетку. Формально же он всё еще находится в какой-то конкретной клетке. Если решу отвязываться от клеток совсем — чувствую придётся многое перелопатить.

У камеры так же появилось подобие иннерции. Чем сильнее игрок выходит за рамки фокуса камеры, тем быстрее она пытается его нагнать.

Объекты

На фоне возни с тенями и всем остальным, идей с объектами как-то особо не возникало.

Но в целом добавил объектам возможность быть анимированными. На примере видео выше видно, что у факелов есть анимации.

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

Наконец-таки добавил объектам понятия слой. Когда писал первую статью у меня все объекты рисовались по порядку их следования в списке. И последним был игрок, чтобы находиться поверх всех объектов. Если какой-то объект нужно было бросить на пол — приходилось бросать его в конец списка соответственно он рисовался уже поверх игрока. Это безусловно не могло так оставаться. Поэтому была добавлена глубина для объектов. Теперь перед отрисовкой все объекты сортируются по глубине и рисуются всегда как надо.

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

Еще я добавил фаерболы и пушки, которые ими стреляют. Здесь ничего интересного, но они как минимум анимированы. Наносят урон и вообще мило выглядят. Ну а у пушки как и у пик точёных есть настраиваемый паттерн. Уже можно делать комнаты наполненные опасностями :)

Добавил рычаг. Работает практически так же как и нажимная плита которая у меня уже была. Так что без сюрпризов.

Диалоговая система

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

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

К сожалению принести ему "банку" через диалог пока не получится.

Буду развивать возможности системы. Открытие реплик на основе других реплик, а так же на основе имеющихся в инвентаре вещей.

Редактор уровней

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

Никакого абстрактного мышления не хватит чтобы прдеставить, что из себя представляет этот уровень на котором всего лишь 11 объектов кроме стен и пола.
Никакого абстрактного мышления не хватит чтобы прдеставить, что из себя представляет этот уровень на котором всего лишь 11 объектов кроме стен и пола.

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

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

Кусок «геймплея» целиком

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

Продолжение следует
Всем хорошего настроения!
6565
11 комментариев

Ключ так забавно в размерах меняется, что я даже залип

5

Чисто случайно получилось. Но я решил оставить. Выглядит действительно "под ретро" :)

5

Выглядит круто! )

2

Выглядит круто! 
Если нужна помощь с отрисовкой спрайтов и анимацией, могу помочь.
Опыт есть. 

1

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

1

Выглядит как 99% говна в стиме. Все на этих редакторах делют "закос под ретро" игры. Никому они нахрен не нужны. Только если карты будут в игре пофармят 2 часа и всё.

Лол. При чем тут стим? Я пишу игру для себя без готовых редакторов и прочего. Если этот смысл не понятен - проходите мимо, здесь никто ничего не продаёт.
Никому они нахрен не нужныПередавай привет Stardew Valley

3