Ich denke darüber nach, mir ein einfaches 2D-Spiel zu schreiben. Es wird zunächst nicht mit perfekter Grafik oder perfektem Gameplay glänzen, aber ich würde es als meinen ersten Schritt in der PC-Spieleentwicklung betrachten. Stellen Sie sich ein solches einfaches Sprite-basiertes 2D-Spiel vor (wie Heroes IV oder Startcraft BroodWar).
Ich möchte, dass das Gameplay Tag / Nacht mit den entsprechenden Beleuchtungsänderungen unterstützt und es gleichzeitig wahnsinnig wird, für jede Beleuchtungsnuance Sprites erstellen zu müssen. Daher habe ich beschlossen, dass das Hinzufügen einer halbtransparenten Ebene über anderen Objekten ausreicht.
Das Problem bei dieser Lösung ist, dass wenn ich ein Lichtquellenobjekt im Spiel habe (wie der Held, der eine Fackel trägt oder ein brennendes Gebäude), es einen helleren Bereich geben muss, oder? Wie würden Sie vorschlagen, um den gewünschten fackellichten visuellen Effekt zu erzielen, da ich meine halbtransparente Schicht über alles lege? Vielleicht diese Ebene neu zeichnen und "Lücken" oder andersfarbige Bereiche hinzufügen, basierend auf dem Lichteffekt?
Antworten:
Ich weiß nicht, in was Sie programmieren, aber so habe ich es in XNA gehandhabt:
List<Light>
Objekt erstellt / gelöscht.Light
Objekte an die angefügtList<Light>
.RenderTarget2D
.Light
s iteriert undRenderTarget2D
mit einer von mir erstellten Textur wie folgt gezeichnet :(Hinweis: Ich habe hier die Werte R, G und B verwendet, aber Sie sollten wahrscheinlich den Alphakanal in Ihrer verwenden tatsächliche Textur.)
Nun gibt es ein paar Dinge zu beachten:
Zu Punkt 4:
Eigentlich habe ich zwei benutzerdefinierte Shader, einen zum Zeichnen der Lichter zum Beleuchtungs-Rendering-Ziel (Schritt 4) und einen zum Zeichnen des Kachel-Rendering-Ziels zum Bildschirm unter Verwendung des Beleuchtungs-Rendering-Ziels (Schritt 5).
Mit dem unter Punkt 4 verwendeten Shader kann ich einen "Leuchtkraft" -Wert hinzufügen (was ich nenne). Dieser Wert wird
float
mit jedem Pixel in der Textur multipliziert, bevor er zum Render-Ziel hinzugefügt wird, damit ich die Lichter im Wesentlichen heller oder dunkler machen kann.An dieser Stelle berücksichtige ich auch den "Skalierungs" -Wert des Lichts, was bedeutet, dass ich mit nur einer Textur große oder kleine Lichter haben kann.
Zu Punkt 5:
Stellen Sie sich das Beleuchtungs-Rendering-Ziel so vor, dass es im Wesentlichen einen Wert für jedes Pixel von 0 (schwarz) bis 1 (weiß) aufweist. Der Shader multipliziert diesen Wert im Wesentlichen mit den RGB-Werten für ein Pixel im Kachel-Rendering-Ziel, um das endgültig gezeichnete Bild zu erhalten.
Ich habe hier auch etwas mehr Code, in dem ich (an den Shader) einen Wert übergebe, der als Tag / Nacht-Overlay-Farbe verwendet werden soll. Dies wird auch mit den RGB-Werten multipliziert und in die Berechnungen der Beleuchtungsrenderingziele einbezogen.
Auf diese Weise können Sie nicht verhindern, dass Licht um Objekte herumgeht, und so weiter, aber zumindest für meine Zwecke ist es einfach und funktioniert gut.
Ich habe hier und hier detailliertere Blog-Beiträge verfasst , die dir vielleicht helfen. Ich habe momentan keine Zeit, aber wenn Sie möchten, kann ich hier auf gamedev näher eingehen.
Oh, und hier ist ein Blick darauf in meinem Karteneditor:
quelle
Draw
Sie herausfinden, ob eine Kachel über Lichter verfügt oder nicht. Ich durchlaufe nicht alle gezeichneten Kacheln in derUpdate
Methode, daher würde ich dafür zusätzlichen Overhead hinzufügen. Außerdem versucht XNA zu gewährleisten, dass dieser CodeUpdate
60 Mal pro Sekunde aufgerufen wird, sodass möglicherweiseDraw
Aufrufe dafür geopfert werden. Dies bedeutet, dass dieser Code tatsächlich seltener aufgerufen wird.Normalerweise wird die Beleuchtung in 2D-Spielen ausgeführt, indem für alle Sprites eine normale Karte erstellt und anschließend die 3D-Beleuchtungseffekte für die 2D-Sprites berechnet werden. Dies ist locker als "2.5D" bekannt. Ich würde es jedoch nicht empfehlen, dies in Ihrem ersten Spiel zu tun, da es komplex ist.
Hier ist ein fantastisches Video von jemandem, der dies in XNA getan hat: http://www.youtube.com/watch?v=-Q6ISVaM5Ww
Das heißt, es gibt wahrscheinlich Möglichkeiten, ein Pseudo-Beleuchtungssystem zu betrügen und zu erhalten, das mit verschiedenen Annahmen funktionieren könnte.
quelle
Es ist schwierig, einen Ansatz vorzuschlagen, wenn Sie nicht genau wissen, welchen Effekt Sie erzielen möchten. Details wie ob die Lichter durch die Umgebung behindert werden sollen oder nicht, was ist der Standpunkt Ihres Spiels, inwieweit sollte das Licht mit der Umgebung interagieren, etc.
Ich werde aber meine zwei Cent fallen lassen. Sehen Sie, ob dieses Tutorial von Catalin Zima mit dem Titel Dynamic 2D Shadows zu Ihrer Rechnung passt. Wie Sie sehen, hat das Licht einen Radius und geht nicht durch Hindernisse. Sie können den Radius und die Farbe ein wenig animieren, damit sie einem echten Fackellicht näher kommen.
In diesem Fall fungiert das Licht als eine Art Überlagerung über Ihrer Szene, interagiert jedoch nicht in demselben Maße wie in Johns Beispiel, obwohl Hindernisse berücksichtigt werden.
Bearbeiten
Catalin verlinkt auf einen anderen Artikel, den er als Referenz verwendet hat, aber der Link ist unterbrochen. Hier ist ein aktualisierter Link .
quelle