Autor Beitrag
knittel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Di 13.09.11 18:19 
Hallo allerseits,
Ich will die Andorra Engine benutzen um ein 2D-Rollenspiel zu entwickeln. Das ganze soll ziemlich dunkel ausfallen.
Ich wollte es so machen, dass grundsätzlich erstmal alles dunkel ist und nur ein Lichtstrahl von der Taschenlampe des Spielers ausgeht und Umgebung beleuchtet.

Meine Grundidee war es erstmal alles zu zeichen und dann einen schwarzen Kasten drüber male, welchen ich dann, da wo das Licht ist durchsichtig mache. Das Problem ist ich, weis zwar wie ich berechnen könnte, wie hell es an einem Punkt seien soll. Das eigentliche Problem ist, ich weis nicht wie ich aus dem schwarzen Kasten wieder die Farbe "subtrahiere".

Ich wäre erfreut, wenn jemand eine Lösung kennt.
Danke im voraus.

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 13.09.11 19:02 
Soweit ich weiß, unterstützt Andorra 2D Licht von Haus aus.

andorra.sourceforge....sses.TAd2dLight.html
LG!
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Di 13.09.11 21:00 
Hi,
auf Anhieb wüsste ich jetzt nicht, wie man den Lichtkegel darstellt, aber die Andorra Engine kommt mit Licht gut klar.
Zu erst müsstest du in deiner Render Routine die Beleuchtung einschalten und ein dunkeles Licht definieren. Die Elemente, die gezeichnet werden sollen, müssen in ihrer Zeichenroutine dann die Beleuchtung wieder ausschalten oder ein helles Licht hinzufügen. Ich müsste mir das im Detail aber selbst mal anschauen,

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Render;
begin
{...}
    AdDraw.BeginScene;

    AdDraw.Options := AdDraw.Options + [aoLight];
    AdDraw.Scene.AmbientColor := Ad_ARGB(255505050);
{...}

    AdDraw.Options := AdDraw.Options - [aoLight];
    AdDraw.EndScene;
{...}
end;


Vielleicht hilft dir das ja als Ansatz weiter. Wenn ich eine neue Idee dazu habe, gebe ich dir Bescheid.


edit:
Mir ist gerade eine Idee für eine unsaubere Lösung gekommen :-D
Wenn du deinen Lichtkegel als Grafik vordefinierst, dann kannst du eine Klasse von TImageSpriteEx ableiten.
Dort nutzt du dann die Methode SetAngle(val : double) um den Kegel zu drehen.
Die DoDraw Methode überschreibst du mit

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TLichtkegel.DoDraw;
begin
  AdDraw.Options := AdDraw.Options - [aoLight];
  inherited DoDraw;
  AdDraw.Options := AdDraw.Options + [aoLight];
end;

Sprich: Vor dem Zeichnen Licht aus, danach wieder ein.
Jetzt könnte man die Kollisionsabfrage nutzen, um andere Sprites, die sich innerhalb des Kegels befinden auch sichtabr zu machen.

_________________
Delphi: XE - OS: Windows 7 Professional x64
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Di 13.09.11 21:16 
Andorra hat tolle Beispiele mit Sourcecode.
Auch mit Licht und Shading. Musst du dir nur mal anschauen. Oder Maskieren.
Eines von beiden lässt sich für deine Zwecke gut verwenden ;)
knittel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Do 15.09.11 16:49 
Vielen Dank. Ihr habt mir alle sehr weitergeholfen. :)

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."