Partikelexplosion von gag |
[color=darkblue:9e36a30ddf]Hier die Grundlage einer Partikelexplosion.[/color:9e36a30ddf] Als Bild kommt ein beliebiges bis 1024x768 in Frage Mit der Variable Lebenmax läßt sich die "Lebensdauer" der Pixel ändern. Demnächst werde ich den Code um Farbeffekte erweitern, wie z.B. das "aufglühen" oder "verbluten" :wink: [code:1:9e36a30ddf] ; Pixel-Explosion Graphics 1024,768,32,1 SetBuffer BackBuffer() Dim Pixel(787000,6) ; Feld 1 = x ; Feld 2 = y ; Feld 3 = rgb ; Feld 4 = acc x ; Feld 5 = acc y ; Feld 6 = Lebenszeit Global Bild = LoadImage ("Bild.bmp") Global imgw = ImageWidth(Bild) Global imgh = ImageHeight(Bild) Global bx = 512-(imgw/2); zentrieren Global by = 384-(imgh/2) Global Anzahl Global Lebenmax = 60 DrawImage Bild , bx,by Flip Auslesen() Text 400,100, "Taste für Explosion" Text 400,120,Anzahl +" Pixel" Flip Cls WaitKey() Anzeige() End ;---------------------------------- End Function Auslesen() i = 1 ymax = by + imgh xmax = bx + imgw DrawImage Bild , bx,by LockBuffer For y = by To ymax For x = bx To xmax rgb = ReadPixelFast(x,y) If rgb <> 0; kein Schwarz Pixel(i,1) = x Pixel(i,2) = y Pixel(i,3) = rgb Pixel(i,4) = Rnd (-20,20) Pixel(i,5) = Rnd (-20,20) Pixel(i,6) = Rnd (2,Lebenmax) i = i+1 EndIf Next Next UnlockBuffer Anzahl = i End Function Function Anzeige() Cls For z = 1 To Lebenmax Cls LockBuffer For i = 1 To Anzahl Step 2 Pixel(i,6) = Pixel(i,6)-1 x = Pixel(i,1)+Pixel(i,4) y = Pixel(i,2)+Pixel(i,5) If x>1024 Or x<0 Or y>768 Or y<0 ;außerhalb des Bildschirms? (bei LockBuffer notwendig) pixel(i,6) = 0 EndIf If Pixel(i,6) >0 ; noch am Leben? Pixel(i,1) = x Pixel(i,2) = y WritePixelFast (x,y,Pixel(i,3)) EndIf Next UnlockBuffer Flip If KeyDown(1) Then End Next End Function [/code:1:9e36a30ddf] |
von ??? |
Hi! super gemacht! ich habe das mal mit den b3d logo ausprobiert, und es sieht echt geil aus. Leider werden irgendwie keine farbigen Pixel unterstützt ?oder doch? , ich sehe jedenfalls irgendwie nur weiße. mfg olli |
von ??? |
@Freax: Auf jeden Fall werden farbige Pxel unterstützt :D Ich habs grad nochmal probiert. |
von ??? |
Hi! OK Du hast recht! sieht nur so aus bei dem b3d logo, da es sehr viel weiß enthält... mit dem code hier kann man das mit den Farben sehen: [code:1:62084d3261] Dim Pixel(787000,6) ; Feld 1 = x ; Feld 2 = y ; Feld 3 = rgb ; Feld 4 = acc x ; Feld 5 = acc y ; Feld 6 = Lebenszeit Global Bild = CreateImage(256,256) SetBuffer ImageBuffer(Bild) For I = 0 To 100 Color Tan(I) * 100 + 100,255,Sin(I) * 50 + 50 Rect Rnd(256),Rnd(256),Rnd(40),Rnd(40) Next SetBuffer BackBuffer() Global imgw = ImageWidth(Bild) Global imgh = ImageHeight(Bild) Global bx = 512-(imgw/2); zentrieren Global by = 384-(imgh/2) Global Anzahl Global Lebenmax = 60 DrawImage Bild , bx,by Flip Auslesen() Text 400,100, "Taste für Explosion" Text 400,120,Anzahl +" Pixel" Flip Cls WaitKey() Anzeige() End ;---------------------------------- End Function Auslesen() i = 1 ymax = by + imgh xmax = bx + imgw DrawImage Bild , bx,by LockBuffer For y = by To ymax For x = bx To xmax rgb = ReadPixelFast(x,y) If rgb <> 0; kein Schwarz Pixel(i,1) = x Pixel(i,2) = y Pixel(i,3) = rgb Pixel(i,4) = Rnd (-20,20) Pixel(i,5) = Rnd (-20,20) Pixel(i,6) = Rnd (2,Lebenmax) i = i+1 EndIf Next Next UnlockBuffer Anzahl = i End Function Function Anzeige() Cls For z = 1 To Lebenmax Cls LockBuffer For i = 1 To Anzahl Step 2 Pixel(i,6) = Pixel(i,6)-1 x = Pixel(i,1)+Pixel(i,4) y = Pixel(i,2)+Pixel(i,5) If x>1024 Or x<0 Or y>768 Or y<0 ;außerhalb des Bildschirms? (bei LockBuffer notwendig) pixel(i,6) = 0 EndIf If Pixel(i,6) >0 ; noch am Leben? Pixel(i,1) = x Pixel(i,2) = y WritePixelFast (x,y,Pixel(i,3)) EndIf Next UnlockBuffer Delay 50 Flip If KeyDown(1) Then End Next End Function [/code:1:62084d3261] habe mal ein delay 50 hinein gebaut, da BB einfach zu schnell ist :D mfg olli |