![]() |
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:
2. In der Spieleschleife:
AdSurface := TAdTextureSurface.Create(AdDraw);
AdSurface.SetSize(AdDraw.Width, AdDraw.Height);
Delphi-Quellcode:
4. Zeichne dein Spielfeld ohne Stencilbuffer (den brauchen wir nicht mehr) auf das AdDraw
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 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:
Hoffe dir hilft das ;-)
var
r: TAdRect; r := AdDraw.SurfaceRect; AdSurface.Image.DrawEx(AdDraw, r, r, 0, 0, 0, 255, bmMultiply); |
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:
Was ist falsch an dem Code?!
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; Hab die neuen Dll's in den Ordner kopiert... |
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:
Wenn das nicht funktioniert, überprüfe ob der Inhalt des Surfaces (also nur die Lichter) korrekt gezeichnet werden, wenn du bmAlpha als BlendMode angibst.
AdDraw.Activate;
AdSpriteEngine.Draw; AdSurface.Image.Draw(AdDraw, ..., bmMultiply); |
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 ;-) |
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. |
AW: [Andorra 2D] Licht - stufiger Übergang realisieren
Zitat:
|
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.
|
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 08:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz