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,
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(255, 50, 50, 50);
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
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
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.