Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.05.2013, 11:25

2D Map Schatten

Hallo liebe Community,

ich habe, weil ich momentan nicht viel Zeit habe, mit Java ein kleines 2D Spiel angefangen. Ich habe die Map aus einzelnen Tiles aufgebaut, die lediglich Quadrate mit einer Textur sind. Nun wollte ich zum Test eine Art Sonne einbauen, d.h. ein wanderndes Licht, das die helleren Blöcke (Stein und Wand) dazu bringt einen Schatten auf die dunkleren Blöcke (Gras und Sand) zu werfen. Jetzt habe ich allerdings folgendes Problem: Da ich ja lediglich 2D Flächen, also ohne Tiefe habe, kann ich doch schlecht ein Spotlight oder ähnliches verwenden, oder? Wenn doch, wie kann ich so etwas implementieren? Ich zerbreche mir hier grade den Kopf darüber... ?(

Hier ein Bild von der Map:

(Link)


Vielen Dank schon mal für eure Antworten. ^^
Mit vielen Grüßen,
~ EuadeLuxe ~

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

29.05.2013, 11:46

Da gibt es einige Möglichkeiten, denke ich. Die einfachste Möglichkeit, die aktuelle Ansicht in ein separates Rendertarget zu zeichnen, dort aber nur Weiß für Schattenwerfend oder Schwarz für Schattenempfangend. Oder gleich umgedreht, je nach Geschmack. Dann nimmst Du diese Rendertextur und zeichnest sie auf das Orginalbild wie einen nahezu durchsichtigen Stempel drauf, aber jeweils um x Pixel von der Sonne weggeschoben. Damit sind dann aber die Schatten auch auf den schattenwerfenden Mauern sichtbar. Das könntest Du dann ganz einfach beheben, indem Du nachher nochmal alle schattenwerfenden Tiles nochmal drüber malst, so dass sie wieder mit voller Helligkeit erscheinen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

29.05.2013, 12:35

Danke für deine Antwort

Vielen Dank erst mal für deine Antwort, Schrompf. Ich soll die Tiles auf eine separate Grafik, bzw. auf einen übergeordneten Layer, diesen dann verschieben und zu guter Letzt diesen mittels Alpha Blending darüberzeichnen? Gute Idee ^^. Aber ist das nicht ein bisschen Zeitaufwendig? Ich benutze die LWJGL mit Java wodurch ich ein bisschen einsparen muss, was das Rendern angeht.... Dabei habe ich dann allerdings noch eine Frage: worauf soll ich dann zeichnen? Ich meine, wenn ich den Schattenlayer direkt zeichne, überdeckt er ja zuerst den eig. Layer, was bei langsamen Rechnern zu einer unschönen Überlagerung führen könnte oder? Ich habe mir gedacht ich könnte die Schatten auf als einzelne Rechtecke für jedes einzelne Tile zeichnen, aber ich glaube das wäre noch langsamer...

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

29.05.2013, 12:47

Wenn Du nicht gerade für ein altes Handy programmierst, brauchst Du Dir über die Performance keine Gedanken zu machen. Ich zeichne bei Splatter etwa 30 "Layer" mit insgesamt vielleicht 40k Sprites und bin noch bei >100 Bildern pro Sekunde.

Wie Du das technisch umsetzt, kann ich Dir nicht sagen. Ich kenne LWJGL nicht und habe Java einige Jahre nicht mehr in der Hand gehabt. Schnapp Dir die Doku und schau, wie Du das hinbekommen kannst. Das Tempo sollte bei all dem aber auch mit Java nicht kritisch werden, solange das Framework zum eigentlichen Rendern die GPU nimmt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

5

29.05.2013, 13:01

Danke nochmals, Schrompf. Ja, die LWJGL ist lediglich ein Binding von OpenGL für Java, wodurch es denke ich auch die GPU ansprechen kann. Nun ich werde deine Technik jetzt einfach mal ausprobieren ^^. Danke für deine tollen Tipps. Noch eine letzte Frage: Soll ich den Schattenlayer nach dem Rendern der Tiles mitsamt Texturen rendern oder gleichzeitig mit den Tiles? Denn wenn ich ihn nachrendern lasse, habe ich wieder Zeitverlust, kann das Ganze aber besser kontrollieren.

Mit vielen, lieben Grüßen,
~ EuadeLuxe

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

29.05.2013, 13:17

Ich weiß nicht, was Du mit "gleichzeitig" meinst. Die Grafikkarte rendert viele Dinge gleichzeitig, aber das ist eine interne Optimierung, die Dich nicht interessieren muss. Die GPU wird immer die Reihenfolge einhalten, die Du vorgibst. Tile für Tile, Layer für Layer. Bzw. Renderpass für Renderpass, den Begriff "Layer" habe ich dafür bis jetzt noch nie gesehen.

Dein Vorgehen:
- Zeichne alle Tiles mit Texturen und Farben
- Zeichne dann die schattenwerfenden Tiles, in Sonnenrichtung verschoben, mit Alphablending und schwarzer Farbmodulation.
- Zeichne dann nochmal die schattenwerfenden Tiles mit Texturen und Farben, damit sie "auf" dem Schatten erscheinen
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

7

29.05.2013, 13:24

Danke dir, jetzt hab´ ich´s begriffen ^^. Mir war leider noch unklar, ob ich wirklich die schattenwerfenden Tiles zweimal zeichnen kann. Aber da habe ich mich wohl etwas unverständlich ausgedrückt. Danke für all deine Antworten.

Viele liebe Grüße,
~ EuadeLuxe ~

8

30.05.2013, 16:09

Ergebnis

Noch mal danke an dich, Schrompf. Ich habe es jetzt geschafft und dachte mir ich könnte noch ein Bild von dem Endergebnis reinstellen. Hier ist es:


(Link)



Mit vielen Grüßen,
~ EuadeLuxe ~

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

9

30.05.2013, 16:16

Prima! Und jetzt fang an, damit rumzuspielen. Z.B.: Zeichne anstatt eines Schatten-Layers gleich mehrere, jeweils etwas weiter versetzt und mit reduziertem Alpha. Das ist zwar ein bisschen Verschwendung, weil man dasselbe auch etwas rechenzeitschonender mit einem gerichteten Blur-Shader hinbekommen könnte, aber das ist ein Thema für Fortgeschrittene :)
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

10

30.05.2013, 16:19

Alternativ hätte man auch noch eine 3D-Fläche mit Blöcken rendern können und die Schatten könnte man dann mit Shadern implementieren.
Mit einer perspektivischen Ansicht von der Seite würde das bestimmt ganz gut aussehen, aber es wäre halt zeitaufwendiger.

Werbeanzeige