Террария как сделать освещение биос

Обновлено: 04.07.2024

Я пытаюсь сделать свое освещение похожим на Terraria's, block-lighting. Теперь я знаю, как сделать блоки более темными, я могу назначать блоки на определенный уровень света, но как бы я сделал реальную световую сущность, которая излучает свет в круглой форме (может также иметь форму алмаза)?
Помощь была бы также признательна, если бы я не был ясно в своем вопросе, не стесняйтесь спрашивать.

Базовое 2D-освещение очень простое. Просто сделайте дистанционную проверку с вашего блока, на свой свет и используйте это значение для масштабирования вашего света.
Это то, что вы могли бы сделать достаточно просто, поскольку Spritebatch.Draw имеет приятный параметр цветового оттенка [link]

Псевдофункция может быть

Для более приятного взгляда вы можете заменить "distance/light.MaxDistance" более плавным эффектом.
Если вы также хотите, чтобы свет проходил через несколько блоков, таких как Terraria, вы могли подсчитать все блоки между вашим блоком и источником света. Масштабируйте свой LightPower на эту сумму, и вы получите тот же эффект, что и у Terraria.

Конечно, это не оптимизированный способ сделать это, но должен работать.

Последняя версия Terraria, похоже, имеет гладкое освещение на пиксель вместо блока [предварительный просмотр]. Для этого я предполагаю, что они использовали вторую цель рендеринга и/или Pixel Shader, чтобы поддерживать высокую производительность. Это может быть немного сложно, если вы не знакомы с рендерингом конвейеров.

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

PS. В моём методе сурф нужен если надо сделать динамическое освещение от нескольких источников света и если много мелких блоков (без сурфа ГМ будит притормаживать с ними)



А теперь обрати внимание как они двигаются, и как двигаются на видео террарии. Результат не удовлетворяет

ещё нехватало мне видео с какойто террарией смотреть . мой метод работает , притом быстро и гибко

Надо чтоб пиксели на границе двигались ?- нарисуй анимацию пикселей на маске по вкусу и выводи кадрами.
Надо освещение от разных источников света - сурфами

a = place_free(x + 1, y) || place_free(x - 1, y)
|| place_free(x, y - 1) || place_free(x, y + 1);
if instance_exists(objPlayer)
<
if distance_to_object(objPlayer) > 50
&& collision_line(x, y, objPlayer.x, objPlayer.y, objBlockPar, 1, 1)
<
if !a
<
alpha = 0;
draw_sprite_ext(sprite_index, -1, x, y, 1, 1, 0, make_color_rgb(alpha, alpha, alpha), 1);
>
>
>

почему не решение ? что имено неустраевает в этом методе ? он работает

одного да , но рисование сотни спрайтов каждый раз медленней рисовании одного большого

А может быть твой мозг не потянет даже кода, который все это обиграет? м? Мы говорим об обычных обьектах, значение альфы которых вообще можно присваивать через другой обьект, что исключает использование каких либо действий в них. А как на счет обьекта, которые просто рисует спрыйты? О нем ты тоже можешь что нибудь псевдоумное сказать? Или ты даже массивами или другими датаструктурами пользоваться не в состоянии? м? Я слышу только "бла-бла-бла".

Идиотичность этого утверждения повергает меня в ступор. Меденная работа с сурфами усугубляется всеми возможными и невозможными способами, при чем некоторые из них озвучиваешь ты сам. При этом ты еще умудряешься меня как то обвинить в чем то. То ли идиот, то ли толль, хрен разберешь. Ты уж определись, ты за сурфы или против.

Да да я страшный тролль пытающийся всех затроллить. Стоп а может быть я идиот? Ну не знаю тебе видимо видней. Слов просто нет. Если руки из правильного места растут, то сурфом можно без проблем поднять фпс с 5 до 10, но не более.

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

Этот вариант конечно лучшее что можно сделать на ГМ, но сейчас речь именно о террарии где просчёт освещения идёт для каждого блока.

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

Даже у великого Fade написавшего свой маинкрафт, ничего не получилось


Согласен целиком и полностью


У какие мы агрессивные
Вот тебе матрешка, сиди разбирайся. Свет включается по клавише Enter. На моей старенькой gf8400m 45-50 фпс. Годится или мало?

Да да я страшный тролль пытающийся всех затроллить. Стоп а может быть я идиот? Ну не знаю тебе видимо видней. Слов просто нет. Если руки из правильного места растут, то сурфом можно без проблем поднять фпс с 5 до 10, но не более.

Вот тебе матрешка, сиди разбирайся. Свет включается по клавише Enter. На моей старенькой gf8400m 45-50 фпс. Годится или мало?

Ты в террарию то вообще играл? Твой метод такой же костыль как у Qvant только более тормознутый. В твоей "матрёшке" нет даже движущихся источников света, ну это всё фигня сделать можно, меня больше волнует другое, в террарии свет через блок проходит хуже чем через открытое пространство, это и есть главная фишка такого освещения, у тебя же обыкновенные круги, так что не понятно ещё у кого руки то кривее

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

Возьми да и напиши алгоритм, которые сделает тебе динамический свет и затемнение/подсветку блоков, это так сложно?

Так я именно это и написал, или ты уже забыл?

Разговор был о чем? Освещение блоками по 16 пикселей. Разговор был о том, что такой метод "нельзя реализовать" и что там вообще будет плохой фпс. Ты просто пропустил все эти моменты, и начал искать к чему прицепиться за отсутствием каких либо аргументов.

не знаю может я чего пропустил, но тема кажется называется "освещение как в terraria".

Аналогично, люблю общаться с умными людьми.


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


А тепеь возьми, и добавь туда динамическое освещение, или просто подвигай источники света, тебе же не сложно написать такой простой код? Минимаьный фпс при динамическом освещении у меня не опускался ниже 45. Да-да. Возьми и ручками сам напиши, или боишься что получится как с тем примером на 10 фпс?
Да руки то нужно допиливать отдельно.


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

Ну есть ещё люди считающие что на ГМ можно сделать освещение как террарии? Или может кто хочет обозвать меня троллем? Да пожалуйста валяйте.

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

Это так же очевидно, как то что вода мокрая, небо синее а огонь горячий. В тебе как раз никто не сомневается

И ты не переживай, работа идет, но не потому что мне хочется тебе что-то доказать, а потому что это будет полезно людям, которые делают а не разводят демагогию.
Я же не просто забежал тут свои "типа мысли" повыкрикивать и уйти. Так поступают только тролли вроде тебя. Можешь пойти и поискать, пока я работаю, себе другую тему для испражнения, как нужно будет, я позову обратно.

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

В общем пробуйте и отписывайтесь, все ли достаточно быстро работает или не работает. Достаточно ли похоже на треррарию и почему не похоже (специально для троллька который сам ничего не делает).

По результатам личного теста минимальный фпс:
GF 8400 GT, 521 Mb - 90-100 fps
GF GT 220, 1 Gb - потолок для комнаты, 100 fps соответственно
VIA S3G UniChrome интегрированная, 64 Mb - 35-45 fps

Fade
> Уже в который раз встает вопрос по поводу реализации идентичного освещения, как
> во всеми известной игре - Terraria.
а в чем проблема? там не сложное освещение же

Fade
> Так вот, нужно хорошее, производительное решение реализации.
> Пишу на Java
No. А вообще флудфилл чем не устраивает?

> а в чем проблема? там не сложное освещение же
> No. А вообще флудфилл чем не устраивает?
Да тормозит оно. Делаю так:
прохожу циклом по блокам в видимой области;
если текущий блок == воздух
присвоить ему свет 100
иначе
если текущий блок != воздух и он граничит с блоком воздуха, то
вызвать функцию освещения в радиусе (Flood Fill)

Тормозит и все равно не получается так, как в Террарии. Хотя в ней плавное, цветное освещение не тормозит. Я не знаю, каким образом еще реализовать.

Mephistopheles, если алгоритм не сложен, можешь помочь? Уже не один проект бросил из-за этого дурацкого освещения.

Fade
> прохожу циклом по блокам в видимой области;
как часто?

Fade
> если текущий блок == воздух
> присвоить ему свет 100
> иначе
> если текущий блок != воздух и он граничит с блоком воздуха, то
> вызвать функцию освещения в радиусе (Flood Fill)
покажи код, я думаю ты както не так заимплементил алгоритм или не так его применяеш

Обновляется каждый игровой тик. Вот код из метода tick класса World:

Вот сам рендер освещения:

Я прозреваю, что в Террарии вовсе не так, т.к. в ней входы в пещеру затемнены постепенно. Так хочется узнать, как же все-таки сделано в Террарии.
И как, черт подери, у них не тормозит при огромном кол-ве источников света (от магического оружия, от пуль и т.д.) в видимой области? Я поражаюсь просто.

Способ который я описывала тебе в лс вполне справляется с "входы в пещеру затемнены постепенно" и "не тормозит при огромном кол-ве источников света". В Explorisles вообще можно хоть все 3600 видимых блоков факелами заставить - фпс не упадет ни на единицу.

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

Fade
> Обновляется каждый игровой тик.
Жесть, ты с ума сошел?) Обновлять только при каждом обновлении мира, типа блок воткнули или убрали. А если немного заморочиться, то обновлять можно вообще очень малый кусочек мира, который будет обновляться вообще мгновенно.

Fade
> Обновляется каждый игровой тик. Вот код из метода tick класса World:
Жестковато конечно:)

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


и обновляй ее при изменении мира и движении игрока

Это-то понятно, но мне важна правильная реализация. Я и сам знаю, что нужно создать карту освещенности, вырезать участки и так далее. Вопрос стоит в самой реализации.

ArchiDevil, можешь подробнее рассказать?
Rinrin, честно говоря, не понял твой способ.


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

Можете почитать еще эти статьи про питомцев:

Как вызвать?

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

Читайте также: