FadeOut() für den kompletten Screen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Delle
Beiträge: 1132
Registriert: 10.05.2005 22:48

FadeOut() für den kompletten Screen

Beitrag von Delle »

Ich suche schon seit Monaten einen kurzen (!) Code der einen kompletten Screen aus- bzw. einblendet.
ChangeGamma(0,0,0,1)

For i=255 To 0 Step -2
ChangeGamma(i,i,i,0)
Next
Das sieht bischen "billig" und unecht aus.

Könnte nicht mal jemand eine UserLib dafür machen ohne irgendwelche 3D-Fadings?

Ich mein bei den DOS-Spielen früher wurde doch auch immer schön aus- und eingefadet...

Alternative wäre wohl nur pixelweises Auslesen des Screens, runterrechnen der Farbe und wieder darstellen.
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Schau mal im Codearchiv! Da gibts einige Beispiele.
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Benutzeravatar
Epyx
Beiträge: 247
Registriert: 29.08.2004 01:40
Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX
Kontaktdaten:

Beitrag von Epyx »

Unter DOS gabs meines Wissens nur maximal 256 SuperVGA Farben da wars einfach diese gegen 0 zu Faden unter Windows sind 16, 24 oder gar 32 Bit Farben und da kann man nicht einfach irgendwelche Register verändern.

Gamma verändern ist sehr langsam von daher unbrauchbar, warum willst du den Screen nicht mittels eines 3D Sprites einblenden lassen??
Also einfacher wirds wohl kaum gehen, und ne zumindest einfache 3D Karte hat doch schon fast jeder im Rechner ?!!
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
Delle
Beiträge: 1132
Registriert: 10.05.2005 22:48

Beitrag von Delle »

http://www.purearea.net/pb/CodeArchiv/G ... FadeOut.pb ;)

Tja ich habe eben keine "aktuelle" Karte im Rechner, zumindest schmieren bei mir diverse 3D-Befehle ab. Und ich glaub ich bin da nicht der Einzige...

Klar kann man ein Sprite ausfaden, aber es soll ein kompletter Screen ausgefadet werden AUF DEM mehrere Sprites sind und sich eventuell sogar noch bewegen.
Benutzeravatar
Delle
Beiträge: 1132
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Bei wem läuft das? 3.94 bringt einen Speicherfehler...

Code: Alles auswählen

Global FadeDens.f, FadeSpeed.f, FadeState.l, FadeSprite.l

#Fade_State_NoFade    =  0
#Fade_State_FadingOut =  1
#Fade_State_FadingIn  = -1
#Fade_State_FadedOut  =  2
#Fade_State_FadedIn   = -2



Procedure InitFade (Spr.l, sX.l, Sy.l, C)
  Ret = #True
  
  If (FadeSprite => 0) And (FadeSprite <= 10000)
    If (CreateSprite (Spr, 16, 16, #PB_Sprite_Texture)) = #False
      Ret = #False
    Else
      If ((Red (C) + Green (C) + Blue (0)) = 0): TransparentSpriteColor (Spr, 255, 0, 255): EndIf
      StartDrawing (SpriteOutput (Spr)): DrawingMode (1)
        Box (0, 0, 16, 16, C)
      StopDrawing ()
      CreateSprite3D (Spr, Spr)
      ZoomSprite3D (Spr, sX, Sy)
    EndIf
    FadeSprite = Spr
    FadeSpeed  = 2.55
  Else
    Ret = #False
  EndIf
  ProcedureReturn Ret
EndProcedure

Procedure FadeOut ()
  FadeDens  = 0
  FadeState = 1
EndProcedure

Procedure FadeIn ()
  FadeDens  = 255
  FadeState = -1
EndProcedure

Procedure SetFadeSpeed (FS.f)
  ;Geschwindigkeit in % pro Schritt
  FadeSpeed = (255 * (FS / 100))
EndProcedure

Procedure.l GetFadeState ()
  ;Status abfragen:
  ;  0 = Kein Fading
  ;  1 = Fading-Out läuft gerade
  ;  2 = Fading-Out beendet (Bild vollständig ausgeblendet)
  ;
  ; -1 = Fading-In läuft gerade
  ; -2 = Fading-In beendet (Bild vollständig sichtbar)
  
  ProcedureReturn FadeState
EndProcedure

Procedure SetFadeState (FS.l)
  ;Status setzen:
  ;  0 = Kein Fading
  ;  1 = Fading-Out läuft gerade
  ;  2 = Fading-Out beendet (Bild vollständig ausgeblendet)
  ;
  ; -1 = Fading-In läuft gerade
  ; -2 = Fading-In beendet (Bild vollständig sichtbar)

  If (FS = -2): FadeState = -2: FadeDens =   0: EndIf
  If (FS =  2): FadeState =  2: FadeDens = 255: EndIf
  
  ProcedureReturn FadeState
EndProcedure

Procedure Fade ()
  If FadeState
    If (Abs (FadeState) = 1)
      FadeDens + (FadeSpeed * FadeState)
      If FadeDens > 255: FadeDens = 255: FadeState =  2: EndIf
      If FadeDens <   0: FadeDens =   0: FadeState = -2: EndIf
    EndIf
    If (Int (FadeDens) > 0): Start3D (): DisplaySprite3D (FadeSprite, 0, 0, FadeDens): Stop3D (): EndIf
  EndIf
EndProcedure











;*** Example *** _________________________________________________________________________




If (InitSprite () And InitSprite3D() And InitKeyboard () And OpenScreen (800, 600, 32, "Fading"))

  Structure Spr
    X.l
    Y.l
  EndStructure
  
  Dim Spr.Spr(9)
  
  For I = 0 To 9
    CreateSprite (I, 120, 80)
    StartDrawing (SpriteOutput (I))
    Box (0, 0, 120, 80, RGB (Random (255), Random (255), Random (255)))
    StopDrawing ()
    Spr(I)\X = Random (680)
    Spr(I)\Y = Random (420)
  Next
  
  
  Delay (1000)
  InitFade (999, 800, 600, $010101)
  SetFadeSpeed (1)
  FadeIn ()
  
  Repeat
    ExamineKeyboard ()
    If KeyboardPushed (#PB_Key_Space)
      Select GetFadeState ()
        Case #Fade_State_FadedOut
          FadeIn ()
        Case #Fade_State_FadedIn
          FadeOut ()
      EndSelect 
    EndIf
  
    For I = 0 To 9
      DisplaySprite (I, Spr(I)\X, Spr(I)\Y)
    Next
    
    Fade ()
    
    StartDrawing (ScreenOutput ()): DrawingMode (1): FrontColor (255, 255, 255)
      Locate (10, 10): DrawText ("[SPACE] - Fade in/out")
    StopDrawing ()
    FlipBuffers ()
    
  Until KeyboardPushed (#PB_Key_Escape)
EndIf
End
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Funzt perfekt mit PB 3.93.
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag von Eric »

Funzt auch perfekt mit 3.90
PB 3.81 hat geschrieben:Line 12: Constant not found: #True
/:->
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Beitrag von Captn. Jinguji »

Delle hat geschrieben:Bei wem läuft das? 3.94 bringt einen Speicherfehler...
Also, hier läuft das unter 3.94 tadellos.
Ist das Kunst hier, oder kann das weg ?
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Delle hat geschrieben:Bei wem läuft das? 3.94 bringt einen Speicherfehler...
Also, hier läuft das unter 3.94 tadellos.
Hier auch, aber ich bekomm mit PB 3.94 auch die ganze Zeit "Invalid memory access." zurückgekotzt :freak: . Sogar bei glLoadIdentity_() hat der mich angespuckt, aber das auch nur in Verbindung mit Interfaces und Arrays in denen Interfaces gespeichert sind. Oder bei einem Threadende, wobei im Thread Tasten abgefragt werden. Die Nachricht "Invalid memory access." ist dann sooo sinnvoll bei Zeilen wie "EndProcedure" oder das bereits erwähnte "glLoadIdentity_()" :freak: . Und ohne Debugger crashts ganz einfach. OnError spuckt dann das gleiche aus wie der Debugger und man weiß immernoch nicht worans liegt. Als ich endlich einen minimalen Fehler an einer ganz anderen Zeile gefunden habe gings. Der Grund warum ich nichtmehr PB 3.93 nutze ist der: Wenn ich Interfaces in Arrays verlege, kann ich sie nicht in For - Next Schleifen verwenden(es wird einfach nichts hochgezählt oder es ist plötzlich derart hoch, dass es einen "Array Index out of bounds." bringt.
[EDIT]
Und es ist bei vielen Computern sehr sehr unterschiedlich. TheFool sieht nichts, glubschi bekommt einen Linker Error, bei traumatic und ZeHa gehts, bei mir crashts einfach nur mit "Invalid memory access."
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Delle
Beiträge: 1132
Registriert: 10.05.2005 22:48

Beitrag von Delle »

"Invalid memory access" ... wo bekommst Du das genau? Bei Start3D() unten? Und hast Du es noch zum Laufen gebracht?
Antworten