Dalam projek "windows' maze" Java menggunakan algoritma tuangan sinar, semua dinding mempunyai saiz ketinggian yang sama. Matlamatnya ialah untuk mencipta versi dengan saiz ketinggian yang berbeza.
1. Tambah Maklumat Ketinggian pada Peta:
Tambahkan nilai ketiga pada setiap sel dalam peta untuk mewakili ketinggian dinding dalam sel itu. Contohnya, pmap[y][x] = (warna, jarak, ketinggian).
2. Kemas kini Algoritma Pancaran Sinar:
Laraskan Rendering:
3. Pertimbangkan Input Roda Tetikus:
Benarkan pengguna melaraskan ketinggian dinding (dalam mod editor peta) menggunakan roda tetikus.
Coretan Kod Terperinci: Di sini ialah coretan daripada castRayInX yang disemak semula fungsi:
// Check for hits on front or back wall based on direction boolean hit = false; Color c = null; int z = 0; if (slope > 0) { int firstX = ((eye.getX() / SQUARE_SIZE) + 1) * SQUARE_SIZE; for (int x = firstX; x < map[0].length * SQUARE_SIZE; x += SQUARE_SIZE) { int y = (int) (slope * (x - eye.getX()) + eye.getY()); if (isOutside(x, y, Color.MAGENTA, this.showRayCastingX)) break; c = colorAt(x, y); z = heightAt(x, y); if (c == null) c = colorAt(x, y - 1); if (c == null) c = colorAt(x - 1, y); if (c == null) c = colorAt(x - 1, y - 1); if (c != null) { int DX = x - eye.getX(); double DY = y - eye.getY(); hit = true; break; } } if (!hit && slope != Double.POSITIVE_INFINITY) // check back wall for (int x = firstX; x >= 0; x -= SQUARE_SIZE) { int y = (int) (slope * (x - eye.getX()) + eye.getY()); if (isOutside(x, y, Color.MAGENTA, this.showRayCastingX)) break; c = colorAt(x, y); z = heightAt(x, y); if (c == null) c = colorAt(x, y - 1); if (c == null) c = colorAt(x - 1, y); if (c == null) c = colorAt(x - 1, y - 1); if (c != null) { int DX = x - eye.getX(); double DY = y - eye.getY(); hit = true; break; } } } else { int firstX = ((eye.getX() / SQUARE_SIZE)) * SQUARE_SIZE; for (int x = firstX; x >= 0; x -= SQUARE_SIZE) { int y = (int) (slope * (x - eye.getX()) + eye.getY()); if (isOutside(x, y, Color.MAGENTA, this.showRayCastingX)) break; Color c = colorAt(x, y); int z = heightAt(x, y); if (c == null) c = colorAt(x, y - 1); if (c == null) c = colorAt(x - 1, y); if (c == null) c = colorAt(x - 1, y - 1); if (c != null) { int DX = x - eye.getX(); double DY = y - eye.getY(); hit = true; break; } } if (!hit && slope != Double.POSITIVE_INFINITY) // check back wall for (int x = firstX; x < map[0].length * SQUARE_SIZE; x += SQUARE_SIZE) { int y = (int) (slope * (x - eye.getX()) + eye.getY()); if (isOutside(x, y, Color.MAGENTA, this.showRayCastingX)) break; Color c = colorAt(x, y); int z = heightAt(x, y); if (c == null) c = colorAt(x, y - 1); if (c == null) c = colorAt(x - 1, y); if (c == null) c = colorAt(x - 1, y - 1); if (c != null) { int DX = x - eye.getX(); double DY = y - eye.getY(); hit = true; break; } } } // If hit, compute projected height and adjust rendering if (hit) { h = (int) (this.screenDistance / distance * z); int hw = (int) (this.screenDistance / distance * WALL_HEIGHT); // WALL_HEIGHT value is 300px at default int y0 = (hw + vh) / 2; int y1 = (vh - h) / 2; graphics.drawLine(xOnScreen, y0, xOnScreen, y1); }
Nota Tambahan:
Untuk mengesan kembali muka dinding, cuma tambah cerun lain syarat:
} else if (slope > 0 && slope < Double.POSITIVE_INFINITY) {...} // back face
Atas ialah kandungan terperinci Bagaimanakah saya boleh menambah saiz ketinggian yang berbeza pada dinding dalam projek "maze tingkap" Java menggunakan algoritma pemutus sinar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!