[BB2D]Matrixbildschirmschoner

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Firstdeathmaker

Betreff: [BB2D]Matrixbildschirmschoner

BeitragDo, Mai 13, 2004 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese kleine Spielerei ahmt den Matrixeffekt nach (Grüne Zahlenreihen die von oben nach unten lauffen). Mit freundlicher Unterstützung von junky.

Kann man z.B. als Bildschirmschoner benutzen.
(Zu einer .exe compilieren und dann in .scr umbenennen und in den Windows Ordner packen.)


BlitzBasic: [AUSKLAPPEN]
;Matrixbildschirmschoner 
Modes=CountGfxModes()

If GfxModeExists(1280,1024,16)
Graphics_X=1280
Graphics_Y=1024
ElseIf GfxModeExists(1024,768,16)
Graphics_X=1024
Graphics_Y=768
ElseIf GfxModeExists(800,600,16)
Graphics_X=800
Graphics_Y=600
ElseIf GfxModeExists(640,400,16)
Graphics_X=640
Graphics_Y=400
EndIf


Graphics Graphics_X,Graphics_Y,32,1
SeedRnd MilliSecs()
timer=CreateTimer(20);Geschwindigkeit

Dim Feld((Graphics_X/10),(Graphics_Y/10),3);0=Zahl,1=c1,2=c2,3=c4
SetBuffer BackBuffer()

Abstd_X=10;Abstand der Zahlen auf der X Koordinate zueinander
Abstd_Y=11;Abstand der Zahlen auf der Y Koordinate zueinander



; 48 - 57 -> Zahlen von 0 - 9
; 65 - 90 -> große Buchstaben
; 97 - 122 -> kleine Buchstaben
AscIIStart = 48
AscIIStop = 57



;Zufallszahlen setzen
For i=0 To Graphics_X/10
For i2=0 To Graphics_Y/10

Feld(i,i2,0)=Rand(AscIIStart,AscIIStop)
; Feld(i,i2,1)=250;Rot
; Feld(i,i2,2)=255;Grün
; Feld(i,i2,3)=250;Blau
Next
Next

Dim Reihe(Graphics_X/10,2);0=aktiv,1=Standortnummer,2=Diesen Durchgang schon benutzt.


;#############################################;
;=============================================;
; Bilder werden vorberechnet ;
; jede Zahl wird in den benötigten ;
; Farbtönen (Frames) gezeichnet ;
; a -> Zahl von 0 - 9 ;
; b -> Grünton in 5er Schritten ;
; c -> bestimmt in diesem Fall die Helligkeit ;
;=============================================;
font=LoadFont("Verdana",12)
SetFont(font)

Dim Image(AscIIStop)
For a=AscIIStart To AscIIStop
Image(a)=CreateImage(12,12,251)
Next

For a=AscIIStart To AscIIStop
c=250
For b=250 To 0 Step -5
If c>0 : c=c-25 : EndIf
SetBuffer(ImageBuffer(Image(a), b))
Color(c,b,c)
Text(0,0,Chr(a))
Next
Next
;=============================================;
;#############################################;


SetBuffer(BackBuffer())


Repeat

WaitTimer timer

Cls

For i=0 To Graphics_X/10

If Reihe(i,0)=0 And Rand(0,100)=1 Reihe(i,0)=1

For i2=0 To Graphics_Y/10
If Reihe(i,0)=1 And Reihe(i,1)=i2 And Reihe(i,2)=0
;Feld(i,i2,1)=250
Feld(i,i2,2)=250
;Feld(i,i2,3)=250
Reihe(i,1)=(Reihe(i,1)+1)
If Reihe(i,1)>(Graphics_Y/10) Reihe(i,1)=0 Reihe(i,0)=0
Reihe(i,2)=1
EndIf

; jeweilige Images (Frames) werden eingezeichnet
; aber nur, wenn das Image einen Grünton hat
; also in diesem Fall nicht schwarz ist
If Feld(i,i2,2)<>0
DrawBlock(Image(Feld(i,i2,0)), i*Abstd_X, i2*Abstd_Y, Feld(i,i2,2))
EndIf


;If Feld(i,i2,1)>0 Feld(i,i2,1)=Feld(i,i2,1)-50
If Feld(i,i2,2)>0 Feld(i,i2,2)=Feld(i,i2,2)-5
;If Feld(i,i2,3)>0 Feld(i,i2,3)=Feld(i,i2,3)-50
Next

Reihe(i,2)=0
Next

Flip



Until GetKey()<>0 Or MouseXSpeed()<>0 Or MouseYSpeed()<>0
End
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
  • Zuletzt bearbeitet von Firstdeathmaker am Sa, Apr 22, 2006 11:14, insgesamt einmal bearbeitet

regaa

BeitragDo, Mai 13, 2004 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir gehts nicht.
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Blacal

BeitragDo, Mai 13, 2004 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

;Function CreateMatrix(Anzahl,Rot,Grün,Blau)
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 AddMatrixLines(Matrix,Anzahl)
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
;-------------------------------------------------------------------------------
;DeleteMatrixLines(Matrix,Anzahl)
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
;-------------------------------------------------------------------------------
;DeleteMatrix(Matrix)
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
;-------------------------------------------------------------------------------
;CreateMatrixScreen(Länge,Breite)
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
;-------------------------------------------------------------------------------
;Screenwidth(Screen)
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
;-------------------------------------------------------------------------------
;Screenheight(Screen)
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
;-------------------------------------------------------------------------------
;MatrixScreenOptions(Screen,[Speed],[Still],[Matrix])
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
;-------------------------------------------------------------------------------
;UseMatrixLine(Screen,Matrix,[XPos],[YPos])
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
;-------------------------------------------------------------------------------
;UpdateMatrix()
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
;-------------------------------------------------------------------------------
;DrawMatrixScreen(Screen,X,Y,[Image?])
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
;-------------------------------------------------------------------------------
;DeleteMatrixScreen(Screen)
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
;********************************* Types ***************************************
Type Matrix_Screen ;Der Type für die MatrixScreens
Field Image ;Das Bild
Field Speed ;Die Geschwindigkeit (in FPS)
Field Matrix ;Die benutzten MatrixLinien (Bank Handle)
Field Still ;Steht er still? (0,1)
Field Aktiv ;Ist er Aktiv? (0,1)
Field LastSecs ;Millisecs beim letzten Malen der Matrix
Field SecsAbs ;Abstand in Millisecs seit dem letzten Malen
Field Render ;Wie oft soll er Rendern?
Field Millis ;Zeit zwischen dem Rendern (in Millisecs)
End Type
;-------------------------------------------------------------------------------
Type Matrix_Line ;Der Type für die MatrixLinien
Field Image ;Das Bild
Field X ;Die X-Position auf dem MatrixScreen
Field Y ;Die Y-Position auf dem MatrixScreen
Field Screen ;Der benutzte Screen (Type Handle)
Field Matrix ;Die benutzte Matrix (Bank Handle)
End Type


Und hier der code vom Hauptprogramm:
BlitzBasic: [AUSKLAPPEN]

Include "..." ;Die Includedatei von oben

Graphics 1024,768,32,1
SetBuffer BackBuffer()

Main_Matrix=Matrix_CreateMatrix(10,0,10,0) ;10 Linien, Startfarbe 0,10,0)
Main_Screen=Matrix_CreateMatrixScreen(1024,768) ;Erstellt einen Matrix-Hintergrund mit der Größe 1024x768
Matrix_MatrixScreenOptions(Main_Screen,60,0,Main_Matrix) ;Stellt den Hintergrund ein (60 FPS, bewegt sich, Matrixlinien)

While Not KeyHit(1)
Cls

Matrix_UpdateMatrix() ;Updatet die Hintergründe
Matrix_DrawMatrixScreen(Main_Screen,0,0) ;Malt einen Hitnergrund auf den Bildschirm)

Flip
Wend


Ich hab den Code jetzt nicht getestet, kann also einen Tippfehler geben
 

Edlothiol

BeitragDo, Mai 13, 2004 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ums ein bisschen Screensaver - freundlicher zu machen:
BlitzBasic: [AUSKLAPPEN]
If (Left(CommandLine(),2) <> "-s") And (Left(CommandLine(),2) <> "/s") Then End

Graphics 1024,768,32,1
SetBuffer BackBuffer()

Main_Matrix=Matrix_CreateMatrix(10,0,10,0) ;10 Linien, Startfarbe 0,10,0)
Main_Screen=Matrix_CreateMatrixScreen(1024,768) ;Erstellt einen Matrix-Hintergrund mit der Größe 1024x768
Matrix_MatrixScreenOptions(Main_Screen,35,0,Main_Matrix) ;Stellt den Hintergrund ein (60 FPS, bewegt sich, Matrixlinien)
While (GetKey()=0) And (MouseXSpeed()=0) And (MouseYSpeed()=0) And (GetMouse()=0)
Cls

Matrix_UpdateMatrix() ;Updatet die Hintergründe
Matrix_DrawMatrixScreen(Main_Screen,0,0) ;Malt einen Hitnergrund auf den Bildschirm)

Flip
Wend
End

Davor müsste noch der "Include - Datei" - Code von Blacal, wobei ich das jetzt in eine Datei gemacht habe. Ich habe ausserdem die Framerate von 60 auf 35 gesetzt, weil ichs schöner fand, und ein End dahintergesetzt - hat das Beenden maßgeblich beschleunigt. Und natürlich Abfrage von Maus und Tastatur.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group