Бывалый
Регистрация: 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, все, кроме одной.
Если осветить соседнюю ячейку получилось, то ее координата добавляется в очередь.
Последний раз редактировалось WISHMASTER35, 14.02.2015 в 02:26.
|