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
|