# (Umsetzung) Scheinwerfer



## Network (26. Jun 2011)

Hallo,

=> Ich habe ein kleines Spiel programmiert mit folgenden Daten die vieleicht wichtig währen:
- Man sieht das Spielfeld von der Seite (siehe SuperMario)
- Man bewegt Einheiten durch ein Tunnelsystem
- Das Spielfeld ist in viele gleichgroße einzelne Quadrate eingeteilt, also ein Quadrat hat entweder die Einstellung "IstGefüllt"(nicht begehbar) oder "IstNichtGefüllt"(begehbar).
- Man spielt rundenbasiert

=> Da das Spiel im Untergrund stattfindet muss natürlich alles dunkel sein. Am besten noch Taschenlampen(/Scheinwerfer) für die eigene Einheit, damit mehr Stimmung und Realismus ins Spiel kommt

<<<< Problem >>>>
Ich weiss nicht wie ich die Scheinwerfer umsetzen soll.
Das beginnt bereits bei der Zeichnung und endet damit, wie ich diese auf das Spielfeld projeziere (Scheinwerfer sollen ja nicht durch die Wand scheinen)

<<<< Meine Versuche >>>>
Als erstes hab ich mir mit einer eingebauten Funktion in einem Grafikprogramm, Scheinwerferbilder zeichnen lassen. 
Wobei schon das erste Problem auftritt: Ich möchte mein Spiel möglichst Moddingfähig für andere Spieler/Programmierer machen. Ein festes Scheinwerferlicht ist zu unflexibel.

Außerdem scheint ein festes Scheinwerferlicht immer durch Wände hindurch. Das kann man zwar durch "IstGefüllt"-Abfrage verhindern - Befindet sich der Protagonist jedoch auf halber Höhe (Also nicht direkt auf einem Quadrat sondern auf einem Übergang zwischen 2) so kann eine Hälfte des Lichtes durch die Hälfte der Wand scheinen.

Deshalb scheitert es bei der Umsetzung ein Scheinwerferlicht zu "malen", das:
1. Realistisch aussieht (Bzw. dass man erkennt, es solle sich um ein Scheinwerferlicht handeln und nicht um irgendwas Gelb/Weisses)
2. Sich an die Umgebung anpasst

Ich habe oft in Spielen Scheinwerferlichter gesehen, bei den meisten sind es starre langweilige Bilder, die einfach über den Bildschirm mitgezogen werden, bei anderen sind sie unflexibel, bzw. einmal gezeichnet und dann nie wieder und bei wieder anderen wirken sie auch auf Hindernisse.

Leider weiss ich nicht wie ich sowas umsetzen kann, ohne dass durch aufwenige Rechen und Abrageprozeduren mein Spiel anfängt zu hängen.

Vieleicht hat ja jmd. eine Idee oder kennt ein Tutorial was dieses Problem behandelt. Habe bereits eine Menge geggogelt und gesucht aber leider nichts gefunden.


Vielen Dank
Gruß TMI


----------



## Marco13 (26. Jun 2011)

Wenn ich das richtig vertanden habe, wirst du um ziemlich aufwändige Licht/Schattenberechnungen nicht drumrumkommen, da wäre irgendein "Bild" ohnehin der falsche Ansatz (und vermutlich auch das kleinste Problem). Soll das mit reinem Java2D gemacht werden? ???:L


----------



## thewulf00 (27. Jun 2011)

Ich denke auch, dass das aufwendig werden wird - bei Deinen Anforderungen. Du musst wohl in jedem Frame ausgehend vom Scheinwerfer in Richtung des Lichts die Pixel einzeln aufhellen, es sei denn Du triffst auf eine Wand.


----------



## Empire Phoenix (27. Jun 2011)

Hm ohne Shader wird das ziemlich schwer, mit shader immernoch schwer das performant zu lösen. Letztendlich läuft es auf eine art raytracing für das light raus denke ich.


----------



## Hansdampf (27. Jun 2011)

du kannst ja mal im Quellcode schauen, wie es Gott für Left4KDead gemacht hat.
Left 4k Dead


hier noch ein schneller Link (polygon basiert)
https://code.google.com/p/straightedge/


----------



## thewulf00 (27. Jun 2011)

Hansdampf hat gesagt.:


> hier noch ein schneller Link (polygon basiert)
> https://code.google.com/p/straightedge/


Das ist mal richtig cool. Wenn man die verschiedenen View-Modi durchgeht, sieht mal echt klasse Algorithmen! Da ist auf jeden Fall was für Dich dabei.


----------



## Network (27. Jun 2011)

Wow ja das letzte ist ja mal was... Trotz der vielen rumzeichnerei läuft es vollkommen flüssig und dazu auch noch haargenau, ich bin beeindruckt.

Ich habe mir inzwischen auch ein System ausgedacht, bei dem wird das Licht mit dem Start des Programmes vollkommen gezeichnet und in kleine Rechtecke eingezeichnet.
Wenn eines dieser Rechtecke mit einem Objekt kollidiert, zeichnet es das Licht nicht mehr und gibt diese Information an die folgenden Rechtecke weiter.

Das ist aber viel Rechenaufwendiger als dieses Programm... anscheinend.
Und nicht so exakt!
Vieleicht liegt es auch daran, dass ich zu faul bin ein Doppelbuffering auszuführen und statt dessen mehrere JPanels in mehreren Ebenen nehme und darauf meine JLabels mit Bildern über das Spielfeld fahren lasse... Sowie das Licht.

Ich werde mich auf jedenfall dem Annehmen wenn ich herauskriege wie man das kopiert ^^

Danke


----------

