если вдруг кому интересно, как там в Threat свет сделан |
[Nov. 25th, 2013|10:39 am] |
угу, это динамический свет, с обсечением по препятствиям любой формы. чистый пиксель-пидарасинг, никаких векторов.
собственно, алгоритм простой, как поленом по яйцам: трассируем лучи из центра, пока не наткнёмся на стену или расстояние не станет слишком большим, строим из точек касания полигон. потом тупо этот полигон заливаем, уменьшая прозрачность в зависимости от расстояния до центра.
рэйтрэйсер — обычный брезенхем, хуле. заливка полигона — обычная заливка полигона любой формы (угу, не обязательно выпуклого. ну, растеризатор с сохранением направления по вертикали для каждого сегмента, и дальше winding rule).
в принципе, немного «артефачит», но в action game как-то не до этого. да и не заметно почти. если разрешение 320x400 бампнуть, то и ещё меньше заметно будет.
ах, да: лайтмап живёт отдельно от картинки экрана. при выводе лайтмап накладывается на картинку. единственная хитрость тут — использовать premultiplied alpha, иначе цветное освещение косячит (да-да, оно там цветное, хоть на скриншотах этого нихуя и нет).
к сожалению, полутени по краям так сделать проблематично, поэтому обсечениесвета резкое, как понос: тут светло, там чернота. но для игрушки стиля gauntlet оно даже как-то прикольней так.
а. ещё вокруг игрока подсвечиваются непроходимые пиксели, чтобы было видно ближайшие стены. таким образом можно ориентироваться, смотреть на дизайнерские надписи «хуй» в тайлах и заодно не показывать сразу весь уровень, потому что так неинтересно. непроходимые пиксели — просто альфа-маской, без трэйсера.
а ещё я нихуя не придумал, как сделать нормальный collision detector для битмапового уровня, поэтому делаю тупо: создаю bounding ellipse и считаю, сколько непроходимых пикселей внутрь него попало. если больше некоторого количества — то застряли (в игре есть дурацкие тайлы с парой торчащих посредине непроходимых пикселей, поэтому threshold).
стены бывают ещё и косые/закруглённые, утыкаться в них неинтересно, поэтому сделал скольжение вдоль стены. дуболом может ходить в восьми направлениях; если вдруг прямо у него не получается, движок тупо пытается подвигать дуболома по сторонам. если получается — заебись. если нет — застрял нахуй. натурально, двигаем «влево-вправо» относительно того, куда смотрит ебальник дуболома.
максимум двигалки — один пиксель (если надо на пять пикселей вперёд — шагаем по одному пикселю пять раз), поэтому дуболом всё равно периодически застревает в хитровыебаных кривых стенах. но это не критично, его можно чутка повернуть, и он ломанётся дальше. и это в любом случае лучше, чем если бы дуболом всегда тупо утыкался в стену и медитировал на неё. |
|
|
Comments: |
Интересно, а кто-нибудь реализовывал освещённость по типу игры "Жизнь", чтобы освещённость высчитывалась в зависимости от соседних пикселей/точек.
Хотя, это скорее всего либо тормозит, либо тривиальные алгоритмы не работают.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | November 25th, 2013 - 12:06 pm |
---|
| | | (Link) |
|
в смысле? не понял, зачем?
Чтобы смоделировать рассеивание лучей в атмосфере, иначе лунный пейзаж получается: угол, а за ним сразу чернота.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | November 25th, 2013 - 07:38 pm |
---|
| | | (Link) |
|
а. penumbra, то бишь. я над этим немного думал. в принципе, границы у меня есть (полигон же), по границам можно сделать такой блур. но мне вдобавок ещё и нравится резкий переход свет/темнота.
И ещё каустику добавить. И рисовать каждый кадр по минуте.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | November 25th, 2013 - 07:39 pm |
---|
| | | (Link) |
|
да не, как раз можно. граница полигона же есть — можно почитерить и вдоль неё сделать блур, если где-то резкий переход образовался. | |