Wenn Sie einfache Formen verwenden, um die Sicht der Entität zu blockieren, gibt es eine einfache Möglichkeit, dies zu tun, die ich implementiert habe:
Erstellen einer VisionWave
Objekt, das sich entweder horizontal oder vertikal bewegen kann. Sie können ein VisionWave
unter Verwendung einer Ausgangskoordinate, zweier Linien, die diesen Punkt schneiden, und einer Entfernung vom Ausgangspunkt.
Sie sollten 4 Wellen haben: eine nach oben, eine nach unten, eine nach links und eine nach rechts, und die Linien, die sie definieren, sollten eine Steigung von 1 und -1 haben (d.h. ein X). Meine grobe Zeichnung unten zeigt eine Welle (nach rechts), dargestellt durch die >
Charakter.
\ /
\ />
\ / >
@ >
/ \ >
/ \>
/ \
Erstellen Sie eine Schleife, die jede Welle pixelweise ausbreitet. Wenn Sie die Welle ausbreiten, möchten Sie Folgendes tun:
- Markieren Sie jedes Pixel, das von der Welle berührt wird, als sichtbar.
- Wenn eines der Pixel, die von der Welle berührt werden, das Licht blockiert, muss die Welle in zwei Teile geteilt werden, die sich dann rekursiv ausbreiten.
Ich habe ein solches System in meinem Roguelike implementiert und es ist sehr schnell. Stellen Sie sicher, dass Sie Ihren Code auf Engpässe untersuchen.
Wenn Sie sehr clever sind, könnten Sie es mit kreisförmigen Wellen anstelle von geraden Linien versuchen, aber ich weiß nicht, ob das wegen der trigonometrischen Berechnungen schneller ginge.