Seite 1 von 2

FadeOut() für den kompletten Screen

Verfasst: 09.09.2005 22:40
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.

Verfasst: 09.09.2005 22:59
von vonTurnundTaxis
Schau mal im Codearchiv! Da gibts einige Beispiele.

Verfasst: 09.09.2005 23:16
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 ?!!

Verfasst: 09.09.2005 23:19
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.

Verfasst: 09.09.2005 23:25
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

Verfasst: 10.09.2005 00:28
von AndyX
Funzt perfekt mit PB 3.93.

Verfasst: 10.09.2005 00:38
von Eric
Funzt auch perfekt mit 3.90
PB 3.81 hat geschrieben:Line 12: Constant not found: #True
/:->

Verfasst: 10.09.2005 06:33
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.

Verfasst: 10.09.2005 07:20
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."

Verfasst: 10.09.2005 11:22
von Delle
"Invalid memory access" ... wo bekommst Du das genau? Bei Start3D() unten? Und hast Du es noch zum Laufen gebracht?