Wie kann ich Lichter und Schatten in eine mehrschichtige 2D-Tilemap implementieren?


11

Ich bin gerade dabei, ein isometrisches Spiel von Grund auf neu zu schreiben, und ich würde gerne wissen, wie / ob ich Lichter und Schatten hinzufügen kann.

Der Code , den ich bisher haben kann hier gefunden werden , aber es sollte die genug sein zu wissen, gerade jetzt , die Karten sind einfacher 3D - Arrays von Wahr / Falsch - Wert . Hier ist eine Aufnahme der Umgebung:Screenshot der mehrschichtigen Tilemap

Wenn es eine einschichtige Tilemap wäre, wäre es einfach. Ich kann das einfache Raycasting in 2d verstehen, das erforderlich ist.

Da meine Karten jedoch mehrere Höhenstufen sowie höhlenartige Bereiche haben, weiß ich nicht wirklich, wie ich überzeugende Schatten dafür machen soll. Vielleicht ist eine Blocklösung der einzig realistische Weg?


Suchen Sie vorgebackene oder dynamisch erzeugte Beleuchtung? Werden die „höhlenartigen Bereiche“ abgeschnitten angezeigt, wenn der Spieler hereinkommt, oder muss das Licht auch die Decke berücksichtigen? Erwarten Sie, dass jede Kachel binär beleuchtet / dunkel ist oder einen Bruchwert hat?
Anko

1
@Anko Ich würde etwas Bruchteiliges bevorzugen, wie 0 - 1.1 (für zu helle Bereiche wie Explosionen usw.), aber es könnte einfach blockbasiert sein, ohne echte Interpolation oder ähnliches. Ich möchte wirklich, dass es dynamisch ist und mehrere Lichter unterstützt. Und während die "höhlenartigen" / überdachten Bereiche abgeschnitten gezeigt werden, müsste der Algo die Blöcke berücksichtigen, die bei der Berechnung des Lichts nicht angezeigt werden. Wenn Sie beispielsweise ein Haus betreten, verschwinden die Dachblöcke, aber es sollte innen immer noch schattig sein.
Danie Clawson

Wenn Sie nach einer solchen Lösung mit Höhlen und Höhe suchen, haben Sie anscheinend nichts von 2D. Sie suchen wahrscheinlich nach einer vollständigen 3D-Lösung, auch wenn die Kamera immer nach Norden und 45 ° nach unten schaut. Sie sollten sich Techniken wie Schablonenschatten oder ähnliches ansehen.
Adrian Maire

Ich zweitens @AdrianMaire Sie müssen korrekte 3D-Berechnungen durchführen, aber einige Verknüpfungen vornehmen, wenn es keine Interpolation über die Flächen einer "Kachel" gibt. Wenn Sie keine Interpolation durchführen, können Sie wahrscheinlich Strahlen verwenden.
NeomerArcana

Ich habe momentan nicht den Mindspace, um daraus eine Antwort zu machen, aber ich bin gerade auf diesen Blog-Beitrag über die Bestimmung der Sichtlinie für das Gelände der Höhenkarte gestoßen . Es klingt genau so, wie Sie es suchen.
Anko

Antworten:


1

Kann ich empfehlen, zuerst 2D-Schatten zum Laufen zu bringen, auch wenn dies nur für das Level gilt, auf dem sich Ihr Avatar gerade befindet? Es wird einfacher sein, den Code auf diese Weise zu betrachten und zum Laufen zu bringen.

Ich habe Schatten in 2D-Kachelkarten auf verschiedene Arten implementiert. Eine von Eric Lippert bei Microsoft beschriebene Shadowcasting-Methode funktioniert recht gut.

Und der andere Weg, den ich selbst gemacht habe, als ich mir so etwas zum ersten Mal angesehen habe, war, die sichtbaren Kacheln und Kachelkanten orthogonal zu fegen und Kanten (und möglicherweise Ecken iirc) zu erzeugen, die die Szene mit der geringsten Anzahl von Kanten beschreiben. Sie können dann versteckte Kanten entfernen und benutzerdefinierte Schattenfunktionen wie vertiefte Schatten erstellen, wenn Sie ein wenig Wand anzeigen möchten. Erstellen Sie dann Ihre Schattengeometrie (projektives Schattenwerfen?) Und rendern Sie sie darüber.

Aber wenn ich versuche, diese Idee in 3D umzusetzen, wird es einfacher, sie in 3D zu machen. Während die von Eric Lippert beschriebene Methode vermutlich in 3d konvertiert werden könnte. Aber ich denke, Sie werden feststellen, dass es teuer ist, es in 3D zu machen. Vielleicht sehen Sie sich auch den Quellcode für Brogue an. Es kann eine effizientere Implementierung für 2D-Sichtbarkeit / Schattenwurf haben.

Viel Glück.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.