Реклама

 
2 голоса
 
260 просмотров
2.09.2017 / 07:49  Death

Освещение

Нужно от источника света окружностью осветить карту.

Есть массив float[][], где 1 - самое светлое, а 0 - темно.
Цель: осветить вокруг источка света xl и yl окружность, где источник света - 1 освещать, и освещать вокруг до 0. Притом что если ground.getBlock(i, j) != null, то отнимается 0.2f, а если неьу блока, то 0.1f.

Пожалуйста, помогите.

Зарание, спасибо. :)
2.09.2017 / 12:35  Витаминыч
Через попу голова твоя работает и код так же пишет
Ответы
 
1 голос
 
# 2.09.2017 / 08:59  vl@volk
Затратная операция, но если я правильно тебя понял, то нужно изменить уровень освещения для блока по окружности. Сделаем два цикла: один увеличивает радиус до максимального, а другой бегает по кольцу
  1. int MAX_RADIUS = 10;
  2.  
  3. for(int radius = 1; radius <= MAX_RADIUS; radius++;) {
  4.   for(int stepper = -radius; stepper < radius; stepper++) {
  5.     int x = xl + stepper;
  6.     int y = yl + (sqrt(radius*radius - (x - xl)*(x - xl)))  *  sign(stepper);
  7.     Block b = ground.getBlock(x, y);
  8.     if (b == null) {
  9.       float[x][y] -= 0.1f;
  10.     } else {
  11.       float[x][y] -= 0.2f;
  12.     }
  13.   }
  14. }
  15.  
  16. // возврщ знак числа
  17. int sign(int val) {
  18.   if (val < 0) {
  19.     return -1;
  20.   }
  21.   return 0;
  22. }

В общем, самое главное здесь обход кольца и всего диска
2.09.2017 / 09:15  Death
Мне то нужно, что бы оно мне от центра освещала вокруг, так что бы свет во все стороны темнел.
Хотя... Ночью вся карта превращается в 1 уровень света, а потом только тень рисуется, а вот ночью это - 0. Хотел сделать, что бы каждый null блок выдавал свет по окружности.
Так, а факел будет чуть сильнее. То есть, то что в light[][] -= n; можно делать n * силаСвета. У каждый null блок будет выдавать свет в 1 силу, то есть light[][] -= n * 1, а факел в 2.
2.09.2017 / 09:16  Death
Но!
  1. if (b == null) {
  2.       float[x][y] -= 0.1f;
  3.     } else {
  4.       float[x][y] -= 0.2f;
  5.     }

Будет всё одним "закрашено". :-(
2.09.2017 / 09:23  Death
Стоп. Я понял! Всё будет работать. И "градиентом" закрашено будет.
2.09.2017 / 09:27  Death
  1. int sign(int val) {
  2.   if (val < 0) {
  3.     return -1;
  4.   }
  5.   return 0;
  6. }
Вот тут уже явно возвращение 0 должно быть 1, так как там при умножении на 0, даст 0.
2.09.2017 / 10:54  Death
Алгоритм работает... Только в таком виде как мне дали - работает через попу. Я его фиксил как только мог. И всё же, он не кругом рисует, а
-----+++
-----+++
+++-----
+++-----
(где + это обрабатывает, а - не обрабатывает сторону)
И то кажется, что там выберает "случайные" для обработки
2.09.2017 / 11:41  vl@volk
Отразить ещё по горизонтали нужно, то есть получить блок с негативным y и его проверить
Всего: 1

Мы в соцсетях

vk tw tg yt

Пожертвования

Аноним2850 р.
Freddy1700 р.
riseremi1611 р.
NaruTrey800 р.
vlavolk637 р.
  © aNNiMON (Melnik Software)