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

. 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_()"

. 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?