.. .. .. ..   ..
BlitzBasic > Codearchiv > Grafikeffekte/demosAktuallisiert 30.05.2009

..  Bildexplosion - von Travis/Inarie 
Ein kleines Programm, das ein 24-Bit Bitmap auf dem Bildschirm explodieren lässt.

Const alpha = 255*$1000000 + 0*$10000 + 0*$100 + 0 
InputFile$ = "bild.bmp" 

Graphics 1024, 768, 16, 2 
SetBuffer BackBuffer() 
AppTitle "BitMapExplosion" 

SeedRnd MilliSecs() 


; --- Bilddatei laden 
Datei = ReadFile(InputFile$) 

SeekFile Datei, 18 ; Pos für Breite in Pixeln 
ResX = ReadShort(Datei) 

SeekFile Datei, 22 ; Pos für Höhe in Pixeln 
ResY = ReadShort(Datei) 

Rest = (ResX Mod 4): If Rest = 4 Then Rest = 0 ;Restbytes bis Teilbar/4 


Type Pixel 
 Field x#, y#,xs#,ys#,Col 
End Type 

SeekFile Datei, 54 ; Leseposition auf Anfang der Bildinfos setzen 

BildX = 1024/2 - (ResX/2) 
BildY = 768/2 - (ResY/2) 

; --- Einzelne Pixel auslesen --- 
For y = ResY To 1 Step -1 
 For x = 1 To ResX 
  p.pixel = New pixel 
  blue = ReadByte(Datei) 
  green = ReadByte(Datei) 
  red = ReadByte(Datei) 
  p\col = 255*$1000000 + red*$10000 + green*$100 + blue 
  p\x# = x + bildx 
  p\y# = y + bildy 
  winkel# = Rnd(0,359) 
  speed# = Rnd(0.1,1) 
  p\xs#= Cos(Winkel#) * speed# 
  p\ys#= Sin(Winkel#) * speed# 
  If p\col = alpha Then Delete p.Pixel 
 Next 
SeekFile(Datei, FilePos(Datei) + Rest) ; Zeilenende suchen 
Next 

CloseFile Datei 

; Bild zentrieren 




; --- Bild anzeigen --- 
LockBuffer BackBuffer() 
 For p.pixel = Each pixel 
   WritePixelFast(p\x, p\y, p\col) 
 Next 
UnlockBuffer BackBuffer() 

Flip 
Delay 1500 


Repeat 
Cls 


; ==== FPS-Counter ====>> 
 syszeit=MilliSecs() 
 If syszeit>fpszeit+1000 
  fps=fpsct : fpszeit=syszeit : fpsct=0 
 Else 
  fpsct=fpsct+1 
 EndIf 
; ==== FPS-Counter ====>> 

LockBuffer BackBuffer() 
n = 0 
; --- Verlorene Pixel löschen 
For p.pixel = Each pixel 
  

; --- Bild anzeigen --- 

   WritePixelFast(p\x, p\y, p\col) 
  
; --- Bild zerstreuen --- 
 p\x# = p\x# + p\xs# 
 p\y# = p\y# + p\ys# 
 n = n + 1 
 If p\x > 1023 Or p\y > 767 Or p\y<0 Or p\x < 0 Then Delete p 
Next 
UnlockBuffer BackBuffer() 

; --- Programm verlassen 
If n = 0 Then Delay 2000: End 


Color 255,255,255 
Text 0,0, "Pixel: " + n 
Text 0,10, "FPS: " + fps 


Flip 0 
Until KeyHit(1) 
End