Stieß auf ein interessantes Problem. Ich muss herausfinden, wie man die Sichtlinie simuliert - einfach genug, nur auf einem 2D-Gitter mit Hindernissen. Entweder ist eine Gitterzelle sichtbar oder nicht.
Ich kann etwas wirklich rudimentäres in Gang bringen - wie das Verteilen von n Feldern vom Spieler oder das Blockieren der horizontalen Ausbreitung, wenn ein benachbartes Hindernis erkannt wird, aber ich kann mich nicht damit leben lassen. Viele andere Apps verwenden ausgefeiltere Methoden, die die Sichtlinie um Ecken usw. neigen, und ich möchte auf dem neuesten Stand sein.
Bisher war DCSS meine Inspirationsquelle, wenn ich ratlos bin. Ich hoffe, dass ich etwas in die Nähe dessen bekomme, was sie haben: http://crawl.sz.org/ .
Jeder Einblick wäre dankbar - danke für die Hilfe!
(Verzeihen Sie, wenn dies peinlich noobisch ist - erst vor ein paar Wochen mit dem Spielentwickler begonnen und versucht, aufzuholen.)
quelle
Antworten:
Ray Casting ist eine sehr schnelle und effiziente Methode, um die Sichtlinie zu bestimmen. Im Grunde geht es darum, einen Strahl (denken Sie an einen unendlichen Laser, der nicht umgeleitet werden kann) von einer bestimmten Position in eine bestimmte Richtung zu senden. Mit diesem Strahl können Sie beispielsweise bestimmen, welche Punkte er schneidet und wie weit er vom Ursprung entfernt ist, als er einen bestimmten Punkt überquert hat.
So könnte beispielsweise in einem Spieler / Feind-Szenario der Strahl vom Feind ausgehen, wobei die Richtung der Standort des Spielers ist. Wenn der Strahl mit einem festen Plättchen kollidiert, kann der Feind den Spieler nicht sehen. Wenn nicht, kann der Feind den Spieler sehen.
Hier ist ein ausgezeichnetes Tutorial, das helfen sollte.
Sie können auch den Linienalgorithmus von Bresenham berücksichtigen (aufsummiert, es schafft Linien) für etwas, das Fliesen leichter skaliert werden könnten.
quelle
Ich habe Code gebloggt , um die Sichtlinie aus einer Höhenkarte zu berechnen. Eine einfache flache Karte mit Hindernissen ist nur eine sehr flache Höhenkarte, und diese Implementierung ist immer noch vollständig anwendbar.
Hier ist es in C ++ und seine
O(n)
; Wenn Sie die maximale Höhe in der Karte kennen, können Sie eine Scanlinie verfolgen, bei der keine Strahlen mehr unter dieser Höhe verbleiben, und zwar frühzeitig:quelle