public void render(Graphics2D graphics, Vector2 position, double angle) {
angle = clampAngle(angle);
if (map == null) return;
final double da = fov / (double)(RESOLUTION.width - 1);
double currentAngle = clampAngle(-fov / 2.0d) + angle;
currentAngle = clampAngle(currentAngle);
for (int x = 0; x < RESOLUTION.width; ++x) {
if (x == 400) System.out.println(currentAngle);
final double rayDist = raycast(position, currentAngle);
if (rayDist == -1d) continue;
final double dist = rayDist * Math.cos(Math.toRadians(currentAngle - angle));
final double height = wallHeight / dist;
graphics.fillRect(x, (int)((RESOLUTION.height - height) / 2d), 1, (int)height);
currentAngle += da;
currentAngle = clampAngle(currentAngle);
}
}
private double raycast(Vector2 origin, double angle) {
angle = clampAngle(angle);
final double increment = .025d;
final double rad = Math.toRadians(angle);
Vector2 dp = new Vector2(Math.sin(rad), Math.cos(rad)).multiply(increment);
Vector2 at = new Vector2(origin);
double dist = 0d;
for (int i = 0; i < (int)(viewDist / increment); ++i) {
at.plusEquals(dp);
dist += increment;
if (map.intercepts(at)) return dist;
}
return -1d;
}
private double clampAngle(double angle) {
while (angle = 360d) angle -= 360d;
if (angle < 0d) angle += 360d;
return angle;
}
< /code>
Поздравляю, если вы все еще читаете это LOL. Таким образом, в основном проблема заключается в том, что когда я поворачиваю камеру примерно более -50 (+310) градусов, функция raycast всегда возвращает -1 (что в моем коде означает, что ничего не было поражено), что приводит к тому, что весь рендер прекратил работу. Я приложу несколько снимков экрана. < /P>
(работа нормально)
< /p>
(грубо он сломается, но он повернулся [+50], все еще работает нормально)
Подробнее здесь: https://stackoverflow.com/questions/796 ... ne-in-java