Licht\Schattenebene mit Sprite3D ?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Bobo-Jack
Beiträge: 26
Registriert: 08.09.2010 11:59

Licht\Schattenebene mit Sprite3D ?

Beitrag von Bobo-Jack »

Hallo! :D

Ich versuche, für ein Spiel ein Lichtsystem umzusetzen, dass über die Ausgabe des Spiels Dunkelheit legt bis auf bestimmte (sich bewegende) Lichtquellen.
Kenn mich aber mit Sprite3D nicht aus und nach etwas suchen und probieren hab ich festgestellt, dass das mit den Blending Modes anscheinend ziemlich knifflig und nirgends wirklich erklärt ist..

Ich hab mir überlegt, dass man ja ein bildschirmgroßes schwarzes Sprite haben und für jede Lichtquelle ein in der Mitte stark transparentes und nach außen schwächer transparent werdendes Sprite draufzeichen könnte. Von diesem großen Sprite hat man dann ein Sprite3D und das könnte man dann über die Ausgabe des Spiels darstellen...
Aber da man ja - so weit ich weiß - nicht mehr auf andere Sprites zeichnen kann mit DirectX9 wird das wohl eng. :|
Und schrecklich langsam wärs wahrscheinlich so auch...

Also so soll's dann prinzipiell aussehen:
Bild

Habt ihr vielleicht Ideen? :mrgreen: Bitte helft mir... Danke!
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Licht\Schattenebene mit Sprite3D ?

Beitrag von bobobo »

hmm
ohne Sprite3D und auch nur so ähnlich

Code: Alles auswählen

UseJPEGImageDecoder()

;http://makromakro.de/Bilder/MakroTiere/Makrofotos_Insekten/Marienkaefer_Makrofoto.jpg
;dieses Bild holen

If LoadImage(0,"Marienkaefer_Makrofoto.jpg")
  iw=ImageWidth(0)
  ih=ImageHeight(0)
  iid=ImageID(0)
  OpenWindow(0,0,0,iw,ih,"pilt",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  CanvasGadget(0,0,0,iw,ih)
  SetGadgetAttribute(0, #PB_Canvas_Image , ImageID(0))
  r=1600
  Repeat
    event=WaitWindowEvent()
    etype=EventType()
    gadget=EventGadget()
    If event=#PB_Event_CloseWindow
      quit+1
    EndIf
    If event=#PB_Event_Gadget
      
      If gadget=0
        
        If etype=#PB_EventType_LeftButtonDown
          
          StartDrawing(CanvasOutput(0))
          
          DrawingMode(#PB_2DDrawing_AlphaClip|#PB_2DDrawing_Gradient)
          ;DrawImage(iid,0,0)
          ;BackColor(RGBA(0,0,0,0))
          ;FrontColor(RGBA(0,0,0,125))
          GradientColor(0,RGBA(0,0,0,0))
          GradientColor(0.4,RGBA(0,0,0,3))
          
          GradientColor(0.5,RGBA(0,0,0,25))
          GradientColor(0.7,RGBA(0,0,0,48))
          GradientColor(1,RGBA(0,0,0,100))
          ix.f=WindowMouseX(0)
          iy.f=WindowMouseY(0)
          
          CircularGradient(ix,iy,r)
          Circle(ix,iy,r)
          
          StopDrawing()

        EndIf
      EndIf
    EndIf
    
  Until quit
EndIf

;Ergebnis wegspeichern
CreateImage(1,iw,ih)
StartDrawing(ImageOutput(1))
DrawImage(GetGadgetAttribute(0, #PB_Canvas_Image),0,0)
StopDrawing()

SaveImage(1,"D:\Käfers.bmp") ;Pfad und Name anpassen


End
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Licht\Schattenebene mit Sprite3D ?

Beitrag von PMV »

Gibt es einen Grund, warum alles in ein Sprite
zusammen gefasst werden soll? Du kannst
doch beliebige Sprites auf den Screen zeichnen.

Für dein vorhaben malst das große Bild auf den
Screen und anschließend nen Graustufenbild als
Alphakannal, bzw. sogar nen 32-Bit mit eigenem
Alphakannal als Sprite3D da drüber. Fertig. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Bobo-Jack
Beiträge: 26
Registriert: 08.09.2010 11:59

Re: Licht\Schattenebene mit Sprite3D ?

Beitrag von Bobo-Jack »

@ Bobobo:
:mrgreen: ..das Problem liegt nur so ein bisschen darin, dass sich die Lichtquellen ja
jedes Frame bewegen deswegen, hab ich gehofft ich bekomm das irgendwie flotter mit Sprite3D hin.

@ PMV:
Das mit dem Zusammenfassen war nur meine allererste Idee.

Ich hab mir das so gedacht:
Ich hab mein aktuelles Frame. Und dann eine schwarze Ebene.
Für jede Lichtquelle male ich auf die Ebene ein Sprite so ungefähr von der Art: http://i41.tinypic.com/20fuuio.png
In der Mitte am meisten transparent und sich nach Außen abschwächend.
Wenn ich die Ebene dann auf das Bild setze, müsste da wo ich ne Lichtquelle hab die Spielumgebung zu sehen sein und der Rest liegt im Dunkeln.
Das war aber nur mein erster Gedanke und ich glaub das mit dem Licht-Sprite auf die Ebene zeichnen ist nicht so ohne Weiteres möglich. Oder doch?
Und in etwa wie hier sollte das dann aussehen: http://www.youtube.com/watch?v=o9nD2gojGfU :D

Ich hab in PB Bumpmapping-Beispiele gesehen, da ist die Maus ja auch ein Lichtfleck.. die Funktionieren aber leider auch mit 2DDrawing :freak:
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Licht\Schattenebene mit Sprite3D ?

Beitrag von PMV »

Ein transparentes Sprite3D über ein anderes Sprite3D
zeichnen sollte kein Problem sein. Das was du möchtest
ist so was wie "Fog of War" ... danach sollteste mal
suchen.

Dein Problem ist damit aber nicht, überhaupt nur ein
transpantes Sprite an zu zeigen, sondern die Logik
dahiner "Fog of War" um zu setzten und dafür, sagen
wir mal veränderbare "Lichtkegel" an zu zeigen.
Die Echtzeitanimation (das Flackern) in dem YouTube-
Video macht das ganze dann auch noch kniffliger.

Ich mag mir jetzt nicht im Detail überlegen, wie so was
funktioniert ... zudem kommt es auch an, was du
tatsächlich am Ende haben willst. Eine Möglichkeit
für so was wäre aber z.B. deine Karte in Kacheln
auf zu teilen und nicht aufgedeckte Kacheln mit einem
dunklen Sprite zu überdecken, während bei aufgedeckte
Kacheln dieses Sprite komplett entfernt wird. Die
Kacheln dazwischen (nicht komplett aufgedeckt aber
auch nicht komplett versteckt) werden einfach immer
transparenter.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Bobo-Jack
Beiträge: 26
Registriert: 08.09.2010 11:59

Re: Licht\Schattenebene mit Sprite3D ?

Beitrag von Bobo-Jack »

Ja genau, Fog of War triff's ziemlich gut, für ein beschränktes Sichtfeld in Höhlen oder sowas.
Auf das Flackern kommt es eigentlich nicht an, nur auf die Lichtkreise.

Das mit den Kacheln ist ne interessante Idee.
Das Raster müsste eben fein genug sein damit's nicht so sehr auffällt.

Kannst du mir mal zeigen, wie ich meine Lichtquellen-Sprites auf das Bildschirmgroße Sprite bringe?
Dann werd ich mal nen Vergleich der beiden Methoden machen.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Licht\Schattenebene mit Sprite3D ?

Beitrag von PMV »

Das einfachste ist es, mit CreateSprite() nen 32-Bit Sprite
zu erstellen, daraus dann das Sprite3D. Mit der 2D-
Drawing-Lib kannst du dann den Alphakannal entsprechend
wie es nötig ist ändern. Das zeichnen dieser passiert
dann ganz schlicht so, wie man eine normale Map auch
darstellen würde, die in Tiles aufgebaut ist, nur das darunter
(also vorher) die eigentliche Karte gezeichnet wird.

Pseudocode:

Code: Alles auswählen

Start3D()
DisplaySprite3D(eigentliche Karte, 0, 0)
For X = 0 To 10
For Y = 0 To 10
DisplaySprite3D(FogOfWarTile(x, y), x * TileSize, y * TileSize)
Next
Next
FlipBuffers()
Das ist natürlich jetzt eine stark vereinfachte Varianete, wo
die Karte eine feste Größe und Position hat.
Wie man mit Tiles (Kacheln) umgeht, dafür sollte es hier im
Forum oder im Codearchive genug Beispiele geben. :wink:
Zur Not, wenn du nach Wochen immer noch kein Ergebnis
hast, kannst ja dann hier im Forum nachfragen, da
gibt dir dann vielleicht wer anders Tipps und Hilfestellung.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten