Sowas hab ich auch schon vor ~1 einhalb Jahren gecodet. Nur habs ich in Funktionen gepackt, das man es einfacher in sein Programm einfügen kann. Das kann man so prima für Fensterhintergründe verwenden (auch mehrere gleichzeitig in jeweils unterschiedlicher geschwindigkeit)
Hier hab ich die Funktionen zum Beispiel verwendet
hier mal die Inlcude-Datei:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN]
Function Matrix_CreateMatrix(CrM_Anzahl,CrM_R,CrM_G,CrM_B) Local CrM_Bank,CrM_R2,CrM_G2,CrM_B2,CrM_Image Local CrM_Buffer CrM_Buffer=GraphicsBuffer() CrM_Bank=CreateBank((CrM_Anzahl+1)*4) PokeByte CrM_Bank,0,CrM_Anzahl PokeByte CrM_Bank,1,CrM_R PokeByte CrM_Bank,2,CrM_G PokeByte CrM_Bank,3,CrM_B If CrM_R<>0 Then CrM_R2=4 Else CrM_R2=0 If CrM_G<>0 Then CrM_G2=4 Else CrM_G2=0 If CrM_B<>0 Then CrM_B2=4 Else CrM_B2=0 For a=1 To CrM_Anzahl CrM_Image=CreateImage(10,480) SetBuffer ImageBuffer(CrM_Image) For b=1 To 47 If b<47 Then Color CrM_R+CrM_R2*b,CrM_G+CrM_G2*b,CrM_B+CrM_B2*b Else Color 250,250,250 Text 0,(b-1)*10,Chr(Rnd(32,200)) Next PokeInt CrM_Bank,a*4,CrM_Image Next SetBuffer CrM_Buffer Return CrM_Bank End Function
Function Matrix_AddMatrixLines(CrM_Matrix,CrM_Anzahl) Local CrM_R,CrM_G,CrM_B,CrM_R2,CrM_G2,CrM_B2,CrM_Image,CrM_Normal Local CrM_Buffer CrM_Buffer=GraphicsBuffer() CrM_Normal=PeekByte(CrM_Matrix,0) CrM_R=PeekByte(CrM_Matrix,1):If CrM_R<>0 Then CrM_R2=4 Else CrM_R2=0 CrM_G=PeekByte(CrM_Matrix,2):If CrM_G<>0 Then CrM_G2=4 Else CrM_G2=0 CrM_B=PeekByte(CrM_Matrix,3):If CrM_B<>0 Then CrM_B2=4 Else CrM_B2=0 PokeByte CrM_Matrix,0,CrM_Normal+CrM_Anzahl ResizeBank CrM_Matrix,(CrM_Anzahl+CrM_Normal+1)*4 For a=1 To CrM_Anzahl CrM_Image=CreateImage(10,480) SetBuffer ImageBuffer(CrM_Image) For b=1 To 47 If b<47 Then Color CrM_R+CrM_R2*b,CrM_G+CrM_G2*b,CrM_B+CrM_B2*b Else Color 250,250,250 Text 0,b*10,Chr(Rnd(32,255)) Next PokeInt CrM_Matrix,(a+CrM_Normal)*4,CrM_Image Next SetBuffer CrM_Buffer End Function
Function Matrix_DeleteMatrixLines(CrM_Matrix,CrM_Anzahl) Local CrM_Normal CrM_Normal=PeekByte(CrM_Matrix,0) If CrM_Normal<CrM_Anzahl Then RuntimeError "Nicht genug MatrixLinien vorhanden" For a=CrM_Normal-CrM_Anzahl To CrM_Normal FreeImage PeekInt(CrM_Matrix,a*4) Next ResizeBank CrM_Matrix,(CrM_Normal-CrM_Anzahl+1)*4 PokeByte CrM_Matrix,0,CrM_Normal-CrM_Anzahl End Function
Function Matrix_DeleteMatrix(CrM_Matrix) Local CrM_Anzahl,CrM_Lines.Matrix_Line CrM_Anzahl=PeekByte(CrM_Matrix,0) For a=1 To CrM_Anzahl FreeImage PeekInt(CrM_Matrix,a*4) Next For CrM_Lines.Matrix_Line=Each Matrix_Line If CrM_Lines\Matrix=CrM_Matrix Then Delete CrM_Lines Next FreeBank CrM_Matrix End Function
Function Matrix_CreateMatrixScreen(CrM_Lx,CrM_Ly) Local CrM_Handle,CrM_Screen.Matrix_Screen CrM_Screen.Matrix_Screen=New Matrix_Screen CrM_Screen\Image=CreateImage(CrM_Lx,CrM_Ly) CrM_Screen\Matrix=0:CrM_Screen\Still=0:CrM_Screen\Aktiv=1 CrM_Screen\LastSecs=MilliSecs()-200 CrM_Screen\SecsAbs=150 CrM_Handle=Handle CrM_Screen Return CrM_Handle End Function
Function Matrix_ScreenWidth(scW_Screen) Local ScW_Type.Matrix_Screen ScW_Type.Matrix_Screen=Object.Matrix_Screen(ScW_Screen) Return ImageWidth(ScW_Type\Image) End Function
Function Matrix_ScreenHeight(ScH_Screen) Local ScH_Type.Matrix_Screen ScH_Type.Matrix_Screen=Object.Matrix_Screen(ScH_Screen) Return ImageHeight(ScH_Type\Image) End Function
Function Matrix_MatrixScreenOptions(MaS_Screen,MaS_Speed=30,MaS_Still=-1,MaS_Matrix=0) Local MaS_Type.Matrix_Screen MaS_Type.Matrix_Screen=Object.Matrix_Screen(MaS_Screen) If MaS_Speed>0 Then MaS_Type\Millis=1000/MaS_Speed If MaS_Still<>-1 Then MaS_Type\Still=MaS_Still If MaS_Still=0 Then MaS_Type\LastSecs=MilliSecs()-MaS_Type\Millis If MaS_Still=1 Then MaS_Type\Render=0 EndIf If MaS_Matrix>0 Then MaS_Type\Matrix=MaS_Matrix End Function
Function Matrix_UseMatrixLine(UsM_Screen,UsM_Matrix,UsM_X=-138,UsM_Y=-480) Local UsM_Line.Matrix_Line UsM_Line.Matrix_Line=New Matrix_Line UsM_Line\Image=PeekInt(UsM_Matrix,Rand(1,PeekByte(UsM_Matrix,0))*4) UsM_Line\X=UsM_X:UsM_Line\Y=UsM_Y If UsM_X=-138 Then UsM_Line\X=Rand(0,Matrix_Screenwidth(UsM_Screen)/10)*10 UsM_Line\Screen=UsM_Screen UsM_Line\Matrix=UsM_Matrix End Function
Function Matrix_UpdateMatrix() Local UpM_Screen.Matrix_Screen,UpM_Line.Matrix_Line,UpM_A Local UpM_Buffer UpM_Buffer=GraphicsBuffer() For UpM_Screen.Matrix_Screen=Each Matrix_Screen If UpM_Screen\Aktiv=1 And UpM_Screen\Still=0 Then If UpM_Screen\SecsAbs+(MilliSecs()-UpM_Screen\LastSecs)>=UpM_Screen\Millis Then UpM_Screen\SecsAbs=UpM_Screen\SecsAbs+(MilliSecs()-UpM_Screen\LastSecs) UpM_Screen\LastSecs=MilliSecs() UpM_Screen\Render=UpM_Screen\SecsAbs/UpM_Screen\Millis UpM_Screen\SecsAbs=UpM_Screen\SecsAbs-(UpM_Screen\Millis*UpM_Screen\Render) SetBuffer ImageBuffer(UpM_Screen\Image) ClsColor 1,0,0 Cls ClsColor 0,0,0 SetBuffer BackBuffer() UpM_A=Matrix_ScreenWidth(Handle UpM_Screen)/412 If UpM_A=0 Then UpM_A=1 For a=1 To UpM_Screen\Render For b=1 To UpM_A Matrix_UseMatrixLine(Handle UpM_Screen,UpM_Screen\Matrix,-138,-480-((a-1)*15)) Next Next Else UpM_Screen\Render=0 EndIf EndIf Next For UpM_Line.Matrix_Line=Each Matrix_Line UpM_Screen.Matrix_Screen=Object.Matrix_Screen(UpM_Line\Screen) If UpM_Screen\Render<>0 Then For a=1 To UpM_Screen\Render UpM_Line\Y=UpM_Line\Y+15 Next SetBuffer ImageBuffer(UpM_Screen\Image) UpM_Line\Image=PeekInt(UpM_Line\Matrix,Rand(1,PeekByte(UpM_Line\Matrix,0))*4) DrawBlock UpM_Line\Image,UpM_Line\X,UpM_Line\Y If UpM_Line\Y>Matrix_ScreenHeight(Handle UpM_Screen) Then Delete UpM_Line EndIf Next SetBuffer UpM_Buffer End Function
Function Matrix_DrawMatrixScreen(DrM_Screen,DrM_X,DrM_Y,DrM_Image=1) Local DrM_Type.Matrix_Screen DrM_Type.Matrix_Screen=Object.Matrix_Screen(DrM_Screen) If DrM_Image=1 Then DrawImage DrM_Type\Image,DrM_X,DrM_Y Else DrawBlock DrM_Type\Image,DrM_X,DrM_Y End Function
Function Matrix_DeleteMatrixScreen(DeM_ScreenH) Local DeM_Screen.Matrix_Screen,DeM_Matrix.Matrix_Line DeM_Screen.Matrix_Screen=Object.Matrix_Screen(DeM_ScreenH) FreeImage DeM_Screen\Image:Delete DeM_Screen For DeM_Matrix.Matrix_Line=Each Matrix_Line If DeM_Matrix\Screen=DeM_ScreenH Then Delete DeM_Matrix Next End Function
Type Matrix_Screen Field Image Field Speed Field Matrix Field Still Field Aktiv Field LastSecs Field SecsAbs Field Render Field Millis End Type
Type Matrix_Line Field Image Field X Field Y Field Screen Field Matrix End Type
Und hier der code vom Hauptprogramm:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Include "..."
Graphics 1024,768,32,1 SetBuffer BackBuffer()
Main_Matrix=Matrix_CreateMatrix(10,0,10,0) Main_Screen=Matrix_CreateMatrixScreen(1024,768) Matrix_MatrixScreenOptions(Main_Screen,60,0,Main_Matrix)
While Not KeyHit(1) Cls
Matrix_UpdateMatrix() Matrix_DrawMatrixScreen(Main_Screen,0,0)
Flip Wend
Ich hab den Code jetzt nicht getestet, kann also einen Tippfehler geben
|