Показать сообщение отдельно
Старый 13.02.2015, 22:51   #27
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Еще один Minecraft на юнити

Обычный алгоритм расчета освещения(2д версия):
list это FIFO очередь. 
Важно, чтобы очередь была FIFO. 
Тогда сначала будят рассеиваться все первичные источники света, 
затем вторичные, затем третичные и тд.
........................
        while( !list.isEmpty() ) {
            LightPoint pnt = list.poll();
            int x = pnt.x;
            int y = pnt.y;
            int nextLight = pnt.light - 1;
            
            if (pnt.dir != Dir.RIGHT || pnt.dir == Dir.All) { // spread to left
                setMaxLight(map, x-1, y, nextLight, Dir.LEFT);
            }
            if (pnt.dir != Dir.LEFT || pnt.dir == Dir.All) { // spread to right
                setMaxLight(map, x+1, y, nextLight, Dir.RIGHT);
            }
            if (pnt.dir != Dir.UP || pnt.dir == Dir.All) { // spread to down
                setMaxLight(map, x, y-1, nextLight, Dir.DOWN);
            }
            if (pnt.dir != Dir.DOWN || pnt.dir == Dir.All) { // spread to up
                setMaxLight(map, x, y+1, nextLight, Dir.UP);
            }
            
        }
.........................................

    private static void setMaxLight(Map map,int x, int y, int light, Dir dir) {
        if (map.setMaxLight(x, y, light)) {
            addLight(x, y, light, dir);
        }
    }
    
    private static void addLight(int x, int y, int light, Dir dir) {
        list.add( new LightPoint(x, y, light, dir) );
    }

В общем суть такова, что каждая LightPoint из очереди пытается осветить все соседние ячейки. С учетом Dir, все, кроме одной.
Если осветить соседнюю ячейку получилось, то ее координата добавляется в очередь.
Миниатюры
Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 1058
Размер:	17.0 Кб
ID:	21501  

Последний раз редактировалось WISHMASTER35, 14.02.2015 в 02:26.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (13.02.2015)