Darkness encroaches. Darkness brings ruin. I am merely another victim of its icky grasp.
I've spent the last few days working on a field of view system for my game. I want everything behind walls to be obscured in shadows -- a reasonable request, no? Apparently not. No matter how hard i try, nothing reliable comes out! Obvious solutions fail, hard solutions take a lot of time to implement and fail anyway. This has also been the most addictive technical problem in a while: i'd close the program, go outside, but keep going through options in my mind. Surely a solution exists!
I've managed to implement a passable system in the end, except it is way too low-poly and not niceys to look at in motion. Hopefully one day i'll be smart or stubborn enough to either make a better system or somehow smooth out the current one, for example, feed the current field of view into an alghoritm that produces a smooth, slowly moving fog of war (see: Noita's field of view effects). I tried already! I tried lerping (the results were awful but kind of funny), i also tried particles and shaders, but the documentation on the subject is too treacherous to jump into headfirst. Here is the current result, somewhat shrinkified for less file weight:
Тьма близится. Тьма несет разрушение. Я лишь очередная жертва её склизкой хватки.
Последние несколько дней я активно изобретал систему поля зрения. Я хочу, чтобы всё сокрытое толщей стен пространство было сокрыто тенями. Вроде запрос звучит выполнимо, да? А вот фиг вам. Как бы я не старался, ни черта не выходит. Простые способы не работают. Сложные способы отнимают уйму времени, а потом ещё и находят наглость точно так же не работать. На самом деле, эта задачка вызывает нехилое привыкание: было такое, что я закрывал этот электронный редактор безумия, выходил на улицу по делам, а в голове всё равно прогонял варианты. Ну ведь должно быть какое-то человеческое решение!
В итоге я смог реализовать сносную системку, но она низкополигональная, и в движении на неё смотреть немного больно. Надеюсь, однажды мне хватит ума или упорности, чтобы либо сделать систему получше, либо сгладить текущую. Может, разберусь, как добавить промежуточную стадию, на которой резкие полигоны превращаются в плавный туман войны (примерно такой, как в Noita). Я уже пытался! Я сначала пытался свалить этого теневого монстра линейной интерполяцией (в результате получилось нечто невыносимое и смешное), потом я вооружился системой шейдеров и частиц, но мне пока не хватает знаний и опыта, чтобы вот так с разбегу написать подходящий шейдер. В итоге на текущий момент результат выглядит как-то так, с поправкой на то, что скриншот я немного сжал для снижения его веса:
I did implement the interaction stuff i mentioned in the previous post! Also, draggable and easily addable in-game interface windows are now at my command, and i made a fully working chest to prove it. Now that i can make things clickable, i slowly approach the fun fun proccess of adding furniture, traps and various dungeon paraphernalia.
That is all for today's blog post. Oh, and if you're very curious, the current vision system basically just shoots out 360 wall-hitting rays around the player and combines their result points into a polygon of visibility. Then the said polygon is expanded by 40 points in all directions -- that's the width of one tile, and that makes the walls visible too. This is kind of an embarassingly simple solution, and i am still pissed that nothing i tried worked better than this. Oh well!
Функционал для взаимодействия с внешним миром, упомянутый в прошлом посте, я успешно сваял. А ещё мне теперь подвластны внутриигровые окна, их можно двигать мышкой и легко настраивать. Я закрепил успех созданием рабочего сундука! И теперь, когда на вещи в мире можно тыкать, я постепенно подступаю к стадии, на которой можно будет добавлять мебель, ловушки и всякие прочие элементы, которые обязательно произрастают в фентезийных подземельях.
На сегодня всё! А, и если вам интересно, текущая система поля зрения, по сути, просто выстреливает по кругу 360 лучей, сталкивающихся со стенами, и соединяет результирующие точки в один многоугольник. Всё, что внутри него -- то видно. Потом этот многоугольник расширяется на 40 пикселей во все стороны -- это толщина одного тайла, чтобы стены тоже было видно. Это очень кустарное решение, но оно хотя бы работает, по сравнению с кучей более элегантных вариантов, которые сводят с ума и манят в ночь.