crypt of decay - если вдруг кому интересно, как там в Threat свет сделан [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

если вдруг кому интересно, как там в Threat свет сделан [Nov. 25th, 2013|10:39 am]
Previous Entry Add to Memories Tell A Friend Next Entry
угу, это динамический свет, с обсечением по препятствиям любой формы. чистый пиксель-пидарасинг, никаких векторов.

собственно, алгоритм простой, как поленом по яйцам: трассируем лучи из центра, пока не наткнёмся на стену или расстояние не станет слишком большим, строим из точек касания полигон. потом тупо этот полигон заливаем, уменьшая прозрачность в зависимости от расстояния до центра.

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

в принципе, немного «артефачит», но в action game как-то не до этого. да и не заметно почти. если разрешение 320x400 бампнуть, то и ещё меньше заметно будет.

ах, да: лайтмап живёт отдельно от картинки экрана. при выводе лайтмап накладывается на картинку. единственная хитрость тут — использовать premultiplied alpha, иначе цветное освещение косячит (да-да, оно там цветное, хоть на скриншотах этого нихуя и нет).

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

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

а ещё я нихуя не придумал, как сделать нормальный collision detector для битмапового уровня, поэтому делаю тупо: создаю bounding ellipse и считаю, сколько непроходимых пикселей внутрь него попало. если больше некоторого количества — то застряли (в игре есть дурацкие тайлы с парой торчащих посредине непроходимых пикселей, поэтому threshold).

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

максимум двигалки — один пиксель (если надо на пять пикселей вперёд — шагаем по одному пикселю пять раз), поэтому дуболом всё равно периодически застревает в хитровыебаных кривых стенах. но это не критично, его можно чутка повернуть, и он ломанётся дальше. и это в любом случае лучше, чем если бы дуболом всегда тупо утыкался в стену и медитировал на неё.
Linkmeow!

Comments:
[User Picture]
From:[info]steinkrauz
Date:November 25th, 2013 - 12:05 pm
(Link)
Интересно, а кто-нибудь реализовывал освещённость по типу игры "Жизнь", чтобы освещённость высчитывалась в зависимости от соседних пикселей/точек.

Хотя, это скорее всего либо тормозит, либо тривиальные алгоритмы не работают.
[User Picture]
From:[info]ketmar
Date:November 25th, 2013 - 12:06 pm
(Link)
в смысле? не понял, зачем?
[User Picture]
From:[info]steinkrauz
Date:November 25th, 2013 - 01:25 pm
(Link)
Чтобы смоделировать рассеивание лучей в атмосфере, иначе лунный пейзаж получается: угол, а за ним сразу чернота.
[User Picture]
From:[info]ketmar
Date:November 25th, 2013 - 07:38 pm
(Link)
а. penumbra, то бишь. я над этим немного думал. в принципе, границы у меня есть (полигон же), по границам можно сделать такой блур. но мне вдобавок ещё и нравится резкий переход свет/темнота.
From:[info]grimeach.livejournal.com
Date:November 25th, 2013 - 01:30 pm
(Link)
И ещё каустику добавить. И рисовать каждый кадр по минуте.
[User Picture]
From:[info]ketmar
Date:November 25th, 2013 - 07:39 pm
(Link)
да не, как раз можно. граница полигона же есть — можно почитерить и вдоль неё сделать блур, если где-то резкий переход образовался.