Tippuvat Matrix -koodirivit.
Tarvitaan:
Timer:tmrUpdate - interval 10
pictureBox:picSurface - Formin kokoinen
Koodi on melko tylsästi kommentoitua(sori).
Mikä tahansa fontti käy, mutta Matrix fontin saa täältä:
http://www.deviantart.com/download/2040700/
Edit:
Koodissa on pikkubugi:
Mitä lujempaa kirjaimet liikkuvat, sitä kauempana ne ovat toisistaan, mitä hiljempaa sen lähempänä.
Se ei hirveästi katselemista haittaa, mutta jos joku keksisi ratkaisun sen tappamiseen olisin kiitollinen.
Public Class frmMatrix
Inherits System.Windows.Forms.Form
' Tähän väliin tulee Windows Form Designer generated code
Const CHAR_HEIGHT As Byte = 20
Const LINES As Byte = 21
'taustapuskuri
Dim b As Bitmap
Dim g As Graphics
'rivit
Dim c(LINES) As CodeSlide
'fontti
Dim f As Font
Private Sub frmMatrix_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Byte
For i = 0 To LINES
c(i) = New CodeSlide
Next i
Randomize()
' Taustapuskuri
b = New Bitmap(picSurface.Width, picSurface.Height)
g = Graphics.FromImage(b)
' Matrix fontti
f = New Font("mCode15", 10)
tmrUpdate.Enabled = True
End Sub
Private Sub tmrUpdate_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrUpdate.Tick
Dim i As Integer
Dim a As Byte
g.Clear(Color.Black)
' joka rivi
For a = 0 To LINES
'joka kirjain
For i = 0 To 25
' jos ulkopuolella -> siirrä ylös
If c(a).Pos(i) + c(a).Vel(i) >= b.Height Then
' kirjain ykkönen -> alusta perusarvot
If i = 25 Then
c(a).r = Rnd() * -500 - 300
' lastvelocity auttaa pitämään koko kirjainpötkön kasassa?
c(a).lv = c(a).v
c(a).v = Rnd() * 8 + 9
End If
c(a).Vel(i) = c(a).v
' lastvelocity aloituspisteestä´, jotta saadaan pidettyä kasassa
c(a).Pos(i) = c(a).r - c(a).lv
End If
' siirretään kirjaimia
c(a).Pos(i) += c(a).Vel(i)
' Vaihdetaan merkkiä 30% todennäköisyydellä
If Int(Rnd() * 100) >= 70 Then c(a).rndAsciiInd(i)
' piiretään merkki
g.DrawString(Chr(c(a).Ascii(i)), f, New _
SolidBrush(Color.FromArgb(c(a).Color(i), _
255, c(a).Color(i))), 30 * a, c(a).Pos(i))
Next
Next
picSurface.BackgroundImage = b
picSurface.Refresh()
End Sub
' koodipötkö
Private Class CodeSlide
Public Structure Letter
Dim Ascii As Byte
Dim color As Byte ' vaaleasta vihreään(0-255)
Public pos As Double
Public vel As Double
End Structure
Private Letters(25) As Letter
Public r As Double
Public v As Double
Public lv As Double
Public Property Color(ByVal ind As Byte) As Byte
Get
Return Letters(ind).color
End Get
Set(ByVal Value As Byte)
Letters(ind).color = Value
End Set
End Property
Public ReadOnly Property Ascii(ByVal ind As Byte) As Byte
Get
Return Letters(ind).Ascii
End Get
End Property
Public Property Pos(ByVal ind As Byte) As Double
Get
Return Letters(ind).pos
End Get
Set(ByVal Value As Double)
Letters(ind).pos = Value
End Set
End Property
Public Property Vel(ByVal ind As Byte) As Double
Get
Return Letters(ind).vel
End Get
Set(ByVal Value As Double)
Letters(ind).vel = Value
End Set
End Property
Sub New()
Dim i As Integer
Dim Asc As Byte
Dim v As Byte = Rnd() * 8 + 9
r = Rnd() * 500 - 300
' alustus
For i = 0 To 25
' nappaa validi ascii...
Asc = setAscii()
' väri saadaan suhteesta i/25 = color/255
Letters(i).color = 255 * i / 25
Letters(i).Ascii = Asc
' jonnekin ylös...
Letters(i).pos = i * CHAR_HEIGHT - r
Letters(i).vel = v
lv = v
Next
End Sub
Private Function setAscii() As Byte
' Validit asciit: 65-76, 84, 97-111, 116, 120-122
setA:
Dim d As Byte = Int(Rnd() * 122)
If d < 65 Then GoTo setA
If d > 76 And d < 84 Then GoTo setA
If d > 84 And d < 97 Then GoTo setA
If d > 111 And d < 116 Then GoTo setA
If d > 116 And d < 120 Then GoTo setA
If d > 122 Then GoTo setA
Return d
End Function
Public Sub rndAsciiInd(ByVal ind As Byte)
Letters(ind).Ascii = setAscii()
End Sub
End Class
End ClassMuuten sika siisti, mut tiippuu vaan liian harvaan noi kirjaimet.
Ei vaan mun mielestä. Käytithän Matrix fonttia?
Sitä voi säätää noista konsteista(CHAR_HEIGHT) jos viittii.
Olet Kukkuluuruu täysin oikeassa. Sori. Siinä tosiaan on bugi! Itse en onnistu sitä tappamaan, voisiko joku auttaa?
exe löytyy tästä:
http://koti.mbnet.fi/nordta/Matrix/
Tarviiko toi jonkun .net-dll:n kun tää valittaa että ei oo mscoree.dll tiedostoa.
Siihen tarttee Frameworkin.
Framework 1.1:sen
Kiittii muuten ihan kirotusti koodista. Olen aika pitkään yrittäny keksiä miten saan gdi+:lla piirretyt jutut kuvaksi. Ne kun eivät muuten tahdo pysyä kovinkaan pitkään ikkunassa. Itse tuo Matrix efektihän tuossa ei ollu kovin kummonen, kirjaimiahan pitäisi olla useammassa kerroksessa jne.
Jotkut merkit jää jumiin ja kirjottuu päällekkäin, muuten hyvä :)
Johtuu muuten siitä, että pictureboxi ei ole tarpeeksi korkea
Mulla tulee vaan täällänen koodi ku avaan sen exen:
---------------------------
Matrix.exe - Sovellusvirhe
---------------------------
Sovelluksen alustus epäonnistui (0xc0000135). Lopeta sovellus valitsemalla OK.
---------------------------
OK
---------------------------
ja mist sais sen frameworkin?
Aihe on jo aika vanha, joten et voi enää vastata siihen.