Seite 1 von 1

Richtiges Fading ohne ChangeGamma()

Verfasst: 21.03.2005 17:22
von Gamer
Gibt es noch andere Methoden einen Screen "schön" auszufaden?

ChangeGamma() ist vielleicht beim Fading von weißen Texten auf
schwarzen Screen gut, aber ansonsten sieht es eher unprofessionell aus .-(

Verfasst: 21.03.2005 19:48
von benny
Vielleicht hilft Dir folgendes weiter :

http://www.hja-web.de/websites/fh-web24 ... rog=fading

Verfasst: 22.03.2005 01:52
von Gamer
Hm, das Beispiel wird bei mir gestartet und gleich wieder beendet :-(

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




 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: 22.03.2005 11:37
von benny
Komisch - also bei mir läufts (PB3.93).

Dann scheint's wohl an einem der folgenden Befehle zu liegen.


- InitSprite()
- InitSprite3d()
- InitKeyboard()
- OpenScreen()


Ändern den Code mal so ab, dass Du sie alle seperat aufrufst und darauf
prüfst, ob einer von ihnen "0" wiedergibt (also fehlschlägt). Dann hättest
Du das Problem eingekreist.

Verfasst: 22.03.2005 12:44
von Gamer
Hab ich getestet, daran liegt es nicht :-( Hab PB 3.91...

Also ist es mit PB auch nur schwer möglich einen Screen komplett auszufaden, ist bei BB ja genauso :-(

Verfasst: 22.03.2005 13:16
von benny
Nö, eigentlich ist es - wie der Beispielcode oben zeigen sollte - gar nicht
mal so schwer. Ich weiß nicht warum es bei Dir nicht funktioniert.

Ich glaube nicht, dass es an der PureBasic Version liegt - ich habe ähnliches
Prinzip auch schon unter 3.91 verwendet.


Da das Demo bei Dir gleich wieder beendet wird - scheint sich das Programm
bei Dir gar nicht in der Hauptschleife zu befinden. Ansonsten müßtest Du
es ja wenigstens mit ESC manuell beenden müssen.

Komisch. :roll:

Verfasst: 22.03.2005 14:19
von Lukas-P
Ich hab PB 3.92 und bei mir funktionierts


Hats du den Code mal mit dem Debugger compilled

Verfasst: 22.03.2005 16:41
von Gamer
Ja aber der gibt nichts aus :-( Muss ich wohl updaten...