/
victor_t
/
rogue
Обзор
Документация
Войти
/
victor_t
/
rogue
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
master
src/presentation/VisibilityCalculate.java
67 строк
2 KB
Victor
add: project source code
07 июл 2026, 07:15
07 июл 2026, 07:15
0ff2a00
Код
Авторство
О чём код?
package presentation; import domain.GameSession; import domain.Position; import domain.Levels.GenerationType; import java.util.Arrays; import java.util.List; public class VisibilityCalculate { public static void calculateVisibility(GameSession gameSession, boolean[][] currentlyVisible, boolean[][] mapVisited, List<Integer> visitedRooms) { Position playerPos = gameSession.getPlayer().getPosition(); Character[][] map = gameSession.getCurrentLevel().getGeneration().toMap(); clearArray(currentlyVisible); currentlyVisible[playerPos.getY()][playerPos.getX()] = false; castRaysFromPosition(playerPos, 40, map, currentlyVisible); } private static void castRaysFromPosition(Position startPos, int radius, Character[][] map, boolean[][] currentlyVisible) { int startX = startPos.getX(); int startY = startPos.getY(); for (double angle = 0; angle < 360; angle += 1) { double radians = Math.toRadians(angle); double dx = Math.cos(radians); double dy = Math.sin(radians); double x = startX + 0.5; double y = startY + 0.5; for (int i = 0; i < radius; i++) { x += dx * 0.5; y += dy * 0.5; int cellX = (int) Math.floor(x); int cellY = (int) Math.floor(y); if (!isInBounds(cellX, cellY, map)) break; currentlyVisible[cellY][cellX] = true; if (map[cellY][cellX] == GenerationType.BOUNDS.getValue() || map[cellY][cellX] == GenerationType.VOID.getValue()) { break; } } } } public static void clearArray(boolean[][] array) { for (boolean[] arr: array) { Arrays.fill(arr, false); } } private static boolean isInBounds(int x, int y, Character[][] map) { return y >= 0 && y < map.length && x >= 0 && x < map[0].length; } }