Fade Transition

BlitzPlus Forums/BlitzPlus Beginners Area/Fade Transition

The Forum Archive is locked. These are the original blitzbasic.com forums, kept so their posts can still be read and searched. No new topics, replies or edits can be made here. To join the conversation, head over to the Blitz3D+ forums.

Or a cross-fade:

; Title: 640x480 full-screen fade 
; Version: 3.1 
; Author: Leigh Bowers 

Dim argbScreen%(0, 0, 0) ; 2 screens, 307200 pixels, R, G and B values (1, 307239, 2) 

Graphics 320, 240, 16, 1
img1% = LoadImage("x:\monkey4-320.jpg") 
img2% = LoadImage("x:\monkey6-320.jpg") 
img3%=LoadImage ("x:\monkey6.jpg")
For t=1 To 3
WaitKey 
ScreenFade img1 
WaitKey 
ScreenFade img2
Next
Graphics 640, 480, 16, 1
DrawImage img3%,0,0
Flip

WaitKey
End
ScreenFade 0, 0.2, $ff, $ff, $ff 
ScreenFade 

Function ScreenFade(pimgDestinationImage% = 0, pdblFadeSpeed# = 0.05, ColourR% = 0, ColourG% = 0, ColourB% = 0, pimgSourceImage% = 0) 

Dim argbScreen(1, 307239, 2) 

; Take a copy of the front buffer and the destination screen 

If pimgSourceImage > 0 Then 
SetBuffer ImageBuffer(pimgSourceImage) 
Else 
SetBuffer FrontBuffer() 
End If 

For bytLoop% = 0 To 1 

If bytLoop = 1 Then 
SetBuffer BackBuffer() 
If pimgDestinationImage = 0 Then 
ClsColor ColourR, ColourG, ColourB : Cls ; Fading to a blank screen (of specified colour) 
Else 
DrawBlock pimgDestinationImage, 0, 0 ; The image we're cross-fading in to 
End If 
End If 

LockBuffer 
bnkScreenFade% = LockedPixels() 
intPitch% = LockedPitch() 
bytFormat% = LockedFormat() 
intElement% = 0 

Select bytFormat 
Case 1 
For intY% = 0 To 239 
intOffset% = intY * intPitch 
For intX% = 0 To 319 
lngPixel% = PeekShort(bnkScreenFade, intOffset) 
argbScreen(bytLoop , intElement, 0) = ((lngPixel And $F800) Shr 11) Shl 3 
argbScreen(bytLoop , intElement, 1) = ((lngPixel And $7E0) Shr 5) Shl 2 
argbScreen(bytLoop , intElement, 2) = (lngPixel And $1F) Shl 3 
intOffset = intOffset + 2 
intElement = intElement + 1 
Next 
Next 
Case 2 
For intY% = 0 To 239 
intOffset% = intY * intPitch 
For intX% = 0 To 319 
lngPixel = PeekShort(bnkScreenFade, intOffset) 
argbScreen(bytLoop , intElement, 0) = ((lngPixel And $7C00) Shr 10) Shl 3 
argbScreen(bytLoop , intElement, 1) = ((lngPixel And $3E0) Shr 5) Shl 2 
argbScreen(bytLoop , intElement, 2) = (lngPixel And $1F) Shl 3 
intOffset = intOffset + 2 
intElement = intElement + 1 
Next 
Next 
Case 3, 4 
For intY% = 0 To 239 
intOffset% = intY * intPitch 
For intX% = 0 To 319 
lngPixel = PeekInt(bnkScreenFade, intOffset) 
argbScreen(bytLoop , intElement, 0) = (lngPixel And $FF0000) Shr 16 
argbScreen(bytLoop , intElement, 1) = (lngPixel And $FF00) Shr 8 
argbScreen(bytLoop , intElement, 2) = lngPixel And $FF 
intOffset = intOffset + bytFormat 
intElement = intElement + 1 
Next 
Next 
End Select 

UnlockBuffer 

Next 

; Perform the fade using the appropriate "Poke" 

dblAlpha# = 0.0 
Repeat 

dblAlpha = dblAlpha + pdblFadeSpeed 
If dblAlpha > 1 Then dblAlpha = 1 

LockBuffer BackBuffer() 
bnkScreenFade% = LockedPixels() 
intPitch% = LockedPitch() 
bytFormat% = LockedFormat() 
intElement = 0 

Select bytFormat 
Case 1 
For intY% = 0 To 239 
intOffset% = intY * intPitch 
For intX% = 0 To 319 
r% = Int(argbScreen(0, intElement, 0) + ((argbScreen(1, intElement, 0) - argbScreen(0, intElement, 0)) * dblAlpha)) 
g% = Int(argbScreen(0, intElement, 1) + ((argbScreen(1, intElement, 1) - argbScreen(0, intElement, 1)) * dblAlpha)) 
b% = Int(argbScreen(0, intElement, 2) + ((argbScreen(1, intElement, 2) - argbScreen(0, intElement, 2)) * dblAlpha)) 
PokeShort bnkScreenFade, intOffset, ((r/8) Shl 11) Or ((g/4) Shl 5) Or (b/8) 
intOffset = intOffset + 2 
intElement = intElement + 1 
Next 
Next 
Case 2 
For intY% = 0 To 239 
intOffset% = intY * intPitch 
For intX% = 0 To 319 
r% = Int(argbScreen(0, intElement, 0) + ((argbScreen(1, intElement, 0) - argbScreen(0, intElement, 0)) * dblAlpha)) 
g% = Int(argbScreen(0, intElement, 1) + ((argbScreen(1, intElement, 1) - argbScreen(0, intElement, 1)) * dblAlpha)) 
b% = Int(argbScreen(0, intElement, 2) + ((argbScreen(1, intElement, 2) - argbScreen(0, intElement, 2)) * dblAlpha)) 
PokeShort bnkScreenFade, intOffset, ((r/8) Shl 10) Or ((g/4) Shl 5) Or (b/8) 
intOffset = intOffset + 2 
intElement = intElement + 1 
Next 
Next 
Case 3, 4 
For intY% = 0 To 239 
intOffset% = intY * intPitch 
For intX% = 0 To 319 
r% = Int(argbScreen(0, intElement, 0) + ((argbScreen(1, intElement, 0) - argbScreen(0, intElement, 0)) * dblAlpha)) 
g% = Int(argbScreen(0, intElement, 1) + ((argbScreen(1, intElement, 1) - argbScreen(0, intElement, 1)) * dblAlpha)) 
b% = Int(argbScreen(0, intElement, 2) + ((argbScreen(1, intElement, 2) - argbScreen(0, intElement, 2)) * dblAlpha)) 
PokeInt bnkScreenFade, intOffset, (r Shl 16) Or (g Shl 8) Or b 
intOffset = intOffset + bytFormat 
intElement = intElement + 1 
Next 
Next 
End Select 

UnlockBuffer BackBuffer() 
VWait : Flip False 

Until dblAlpha = 1 

; Done 

Dim argbScreen(0, 0, 0) ; Release the memory 

End Function