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