Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2D] Licht - stufiger Übergang realisieren (https://www.delphipraxis.net/154186-%5Bandorra-2d%5D-licht-stufiger-uebergang-realisieren.html)

igel457 1. Sep 2010 14:45

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Also... du erstellst ein Surface von der Größe des Fensters (wie das geht, ist in der Surface Demo gezeigt) - bei einem Surface handelt es sich um eine Textur, auf die du mit allen anderen Andorra 2D Befehlen drauf Zeichnen kannst - auch das TAdDraw ist ein solches Surface, nur das dessen Inhalte direkt auf den Bildschirm gezeichnet werden.

1. Surface erstellen:
Delphi-Quellcode:
AdSurface := TAdTextureSurface.Create(AdDraw);
AdSurface.SetSize(AdDraw.Width, AdDraw.Height);
2. In der Spieleschleife:
Delphi-Quellcode:
AdSurface.Clear(clBlack);
//Zeichne nun deine Lichter auf das Surface (mit AdSurface.Canvas), wobei du
//AdSurface.Canvas.Brush.BlendMode auf bmAdd stellst. Durch das "bmAdd" addieren
//sich die Farbwerte der Lichter korrekt auf, wenn sie sich überschneiden
4. Zeichne dein Spielfeld ohne Stencilbuffer (den brauchen wir nicht mehr) auf das AdDraw

5. Zeichne das Surface nun multiplikativ auf das Spielfeld. Das hat folgenden Effekt: Die Farbwerte eines jeden Surface-Pixels werden mit dem darunterliegenden Pixel multipliziert: Wo das Surface weiß war (1.0, 1.0, 1.0) wird die Farbe des darunterliegenden Pixels übernommen (da x * 1.0 = x), wo das Surface schwarz war (0.0, 0.0, 0.0) wird auch der darunterliegende Pixel schwarz.
Delphi-Quellcode:
var
  r: TAdRect;

r := AdDraw.SurfaceRect;
AdSurface.Image.DrawEx(AdDraw, r, r, 0, 0, 0, 255, bmMultiply);
Hoffe dir hilft das ;-)

sabbert 1. Sep 2010 23:26

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
So habe alle gemacht, aber es scheint leider nicht zu Funktionieren :(

Es ist alles schwarz, bis auf Taschenlampe(ohne Gradient). Sobald ich keine Gradient-Kreise zeichne werden die Lichter zwar angezeigt aber natürlich ohne den gewünschten Effekt...

Delphi-Quellcode:
     if Map.Licht then //Nur zu Testzwecken
     begin

      AdDraw.Options := AdDraw.Options + [aoLight];
      AdDraw.Scene.AmbientColor := Ad_ARGB(0, 0, 0, 0);

      //Scene einmal zeichnen
      AdSpriteEngine.Draw;

      AdDraw.Options := AdDraw.Options - [aoLight];

      AdSurface.ClearSurface(clBlack);


      AdSurface.Canvas.Brush.BlendMode := bmAdd;

      //Zeichnet weiße Kreise um alle Lampen (Licht)
      Map.Lichtanzeigen(AdSurface);

      //Zeichnet das Taschenlampelicht in weiß
      Figur.Lampe.zeichne(AdSurface);

      //Zeichnet gradient-Kreise um alle Lampen (Schwarz/weiß)
      Map.LichtanzeigenGradient(AdSurface);

      r := AdDraw.SurfaceRect;
      AdSurface.Image.DrawEx(AdDraw, r, r, 0, 0, 0, 255, bmMultiply);


      //Szene zeichnen
      AdSpriteEngine.Draw;

     end else AdSpriteEngine.Draw;
Was ist falsch an dem Code?!
Hab die neuen Dll's in den Ordner kopiert...

igel457 2. Sep 2010 09:00

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Du musst erst die Spriteengine auf das AdDraw zeichnen und dann das Surface mit dem Ergebnis multiplizieren:
Delphi-Quellcode:
AdDraw.Activate;
AdSpriteEngine.Draw;

AdSurface.Image.Draw(AdDraw, ..., bmMultiply);
Wenn das nicht funktioniert, überprüfe ob der Inhalt des Surfaces (also nur die Lichter) korrekt gezeichnet werden, wenn du bmAlpha als BlendMode angibst.

sabbert 2. Sep 2010 15:07

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jo danke hat geklappt ;-)

Sieht schon besser aus hab mal ein Testbild angehängt, wo einfach ein paar Lampen nebeneinander sind.

Muss jetzt nurnoch die Taschenlampe versuchen Gradient zu zeichnen hat noch nicht so geklappt ;-)

igel457 2. Sep 2010 15:51

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Hey, das sieht ja gar nicht mal so schlecht aus, dafür, dass ich den Code für die Grafikplugins nicht getestet habe ;-)

Du solltest - entsprechende Grafiken für das Terrain vorausgesetzt - recht coole Effekte herstellen können - schließlich können die Lampen jede beliebige Lichtfarbe haben und auch flackern etc.

igel457 2. Sep 2010 16:26

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Zitat:

Zitat von sabbert (Beitrag 1047019)
Muss jetzt nurnoch die Taschenlampe versuchen Gradient zu zeichnen hat noch nicht so geklappt ;-)

Ich würde dafür an deiner Stelle den Taschenlampenkegel als vorgefertigtes Bild nehmen und dieses entsprechend Rotiert zeichnen, mit der "TAdImage.DrawRotateAdd" funktion - mit dem Canvas wird das weniger gut funktionieren.

Namenloser 2. Sep 2010 16:28

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Oder mit dem Stencilbuffer den Lichtkegel maskieren und dann vom Mittelpunkt aus einen ausfadenden Kreis im Radius des Kegels zeichnen.

igel457 2. Sep 2010 16:32

AW: [Andorra 2D] Licht - stufiger Übergang realisieren
 
Klingt auch nach einer guten Lösung, doch Surfaces (FBOs) und Stencilbuffer gleichzeitig sind eine Sache, bei der ich nicht garantieren kann, dass sie funktioniert (ich bin mir auf jeden Fall nicht sicher, ob ich es je getestet habe) ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz