Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB.NET: Tekijälista

Sivun loppuun

peki [20.03.2004 14:53:32]

#

Kivan näköinen tekijälista, jonka koodasin aikani kuluksi.

Lomakkeelta on löydyttävä:
Timer: name = tmrUpdate, Interval = 10
PictureBox: name = picSurface, x = 0, y = 0, width = 424,
height = 448
Form: width = 426, height 448

Taustalla on starfield -efekti ja tekijät liukuvat ruudun
yli siten, että ne himmenevät liikkuessaan kohti ruudun
ylälaitaa.

Koodin pitäisi olla suhteellisen hyvin kommentoitua.

Pienillä muutoksilla koodin pitäisi myös kääntyä aiemmissa VB versioissa. (Ongelmakohtia ovat: Alpha kanava, taustapuskuri ja grafiikan piirto)

' tähden tietorakenne
    Private Structure star
        Dim x As Double
        Dim y As Double
        Dim z As Double

        Dim sx As Integer
        Dim sy As Integer

        Dim zv As Double
        Dim b As Integer
    End Structure

    ' tausta puskuri
    Dim b As Bitmap
    ' tausta puskurin graphics olio
    Dim g As Graphics
    ' tekstin sijainti
    Dim pos As Integer = 520

    Dim rect As Rectangle
    Dim stringFormat As New StringFormat
    Dim fnt As Font

    ' tähdet
    Dim stars(99) As Star

    ' Tekijät: tekstin edessä oleva 'R' tarkoittaa tavallista tekstiä, 'B' lihavoitua
    Dim str() As String = {"BProgrammer", "RPeki", "R", "BGraphics", "RGraafikko1", _
    "RGraafikko2", "R", "BDesign", "RDesigneri", "R", "BBetatesters", "RBetaaja1", _
    "RBetaaja2", "RBetaaja3", "R", "RSpecial thanks to Joku and Se", _
    "R- for making this possible", "R", "R", "R" & Chr(169) & " Peki 2003-2004"}

    'alustukset
    Private Sub frmAbout_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer

        ' alustetaan taustapuskuri ja sen graphics olio
        b = New Bitmap(picSurface.Width, picSurface.Height)
        g = Graphics.FromImage(b)

        ' alustetaan tähdet
        For i = 0 To stars.Length - 1
            stars(i).x = Int(Rnd() * 1000) - 500
            stars(i).y = Int(Rnd() * 1000) - 500
            stars(i).z = Int(Rnd() * 900) + 100

            stars(i).zv = Rnd() * 4.5 + 0.5
        Next

        tmrUpdate.Enabled = True
    End Sub

    Private Sub tmrUpdate_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrUpdate.Tick
        ' countteri
        Dim i As Integer
        ' tähden hännän pituus(kun tähti tulee lähelle, täytyy sitä
        ' pidentää, jotta saadaan aikaan 'MotionBlur' efekti
        Dim length As Integer
        ' tähden sijainti ruudulla
        Dim x, y As Integer
        ' apuarvoja length- muuttujan laskemiseen
        Dim xd, yd As Double
        Dim n As Boolean = False

        ' siirrä tekstiä ylöspäin
        pos -= 2
        If pos <= -520 Then pos = 520

        g.Clear(Color.Black)

        ' liikuta tähtiä
        For i = 0 To stars.Length - 1
            ' siirrä lähemmäs
            stars(i).z -= stars(i).zv

            ' laske sijainti näytöllä
            x = stars(i).x / stars(i).z * 100 + (picSurface.Width / 2)
            y = stars(i).y / stars(i).z * 100 + (picSurface.Height / 2)

            ' Jos tähti ulkona siirrä keskelle
            If stars(i).sx >= picSurface.Width Or stars(i).sx <= 0 _
            Or stars(i).sy >= picSurface.Height Or stars(i).sy <= 0 _
            Or stars(i).z < 1 Then
                stars(i).x = Int(Rnd() * 1000) - 500
                stars(i).y = Int(Rnd() * 1000) - 500
                stars(i).z = Int(Rnd() * 900) + 100

                stars(i).zv = Rnd() * 4.5 + 0.5
            End If

            ' tähden 'pituus' (MotionBlur)
            xd = x - stars(i).sx
            yd = y - stars(i).sy
            length = Math.Sqrt(xd * xd + yd * yd)

            ' kirkkaus
            stars(i).b = (6000 * stars(i).zv) / stars(i).z
            ' jos 'motionblur' käytössa himmennä vähän
            If length > 1 Then stars(i).b = (stars(i).b / (length / 2))

            ' Varmista, että b <= 255
            If stars(i).b > 255 Then stars(i).b = 255

            ' piirrä tähti
            g.DrawLine(New Pen(Color.FromArgb(stars(i).b, Color.White), 2), x, y, stars(i).sx, stars(i).sy)

            ' tallenna koordinaatit
            stars(i).sx = x
            stars(i).sy = y
        Next

        ' Keskitä merkki.
        stringFormat.Alignment = StringAlignment.Center
        ' Keskitä merkki (ylhäältä alas) suorakulmiossa.
        stringFormat.LineAlignment = StringAlignment.Center

        For i = 0 To str.Length() - 1
            ' Tekstin viemä alue
            rect = New Rectangle(0, i * 25 + pos, b.Width, 18)

            ' Jos 'B' lihavoi
            If str(i).Substring(0, 1) = "B" Then
                fnt = New Font("Comic Sans MS", 13, FontStyle.Bold)
            Else
                fnt = New Font("Comic Sans MS", 13, FontStyle.Regular)
            End If
            ' Piirrä
            ' Tuo kirkkaus vaatisi varmaan selvennystä:
            ' |sin(2*pi*rect.y/1040) * (255 / 2)|
            ' kulmahan pitää antaa radiaaneissa(siitä 2*pi*rect.y/1040)
            '
            ' Eli sinikäyrällä saadaan tekstin vuorotellen kirkastumaan
            ' ja himmenemään, kun aallonpituutta säädetään sopivasti
            ' saadaan aikaan kivannäköinen efekti
            g.DrawString(str(i).Substring(1, str(i).Length - 1), fnt, _
            New SolidBrush(Color.FromArgb(Math.Abs(Math.Sin(2 * Math.PI * rect.Y / 1040) * (255 / 2)), Color.White)), _
            RectangleF.op_Implicit(rect), stringFormat)
        Next

        ' näytä taustapuskuri
        picSurface.Image = b
    End Sub

kenkku [24.03.2004 16:39:35]

#

Kuulostaa hienolta, mutta ai kun saisi VB5:lle :(

peki [26.03.2004 18:49:06]

#

Voisiko joku kommentoida?

Aku2 [26.03.2004 23:57:37]

#

Siisti.
Hyvin kommentoitukin.

Rupesin innoissani kokeilemaan VB6:lla ja tuli vain erroria... ja vasta jälkeenpäin huomasin että toi onkin NETille :)

Eli NETillä toimii mutta tökkii jonkin verran kun luuppi menee pari kertaa läpi. Muuten ihan siisti.

peki [27.03.2004 08:54:22]

#

Ei se kyllä mulla töki. olis kiva tietää millanen kone sulla on.
Tuo on aika hälyyttävää, sillä tuo sama koodi on tulevassa pelissäni. Vaatii varmaan paljon optimointia.

nomic [27.03.2004 17:53:07]

#

ääh, mä oon niin käsi että en saa tätä muokattua vb6:lle sopivaksi =/ kiinnostaisi kylläkin nähdä miten tää toimii, onkos tästä binarya saatavilla? jos olisi niin olisi mukavaa jos sen saisi myöskin tänne ja näkisi miten se toimii käännettynä tässä tai sitten tossa toisessa koneessa :]
vanhemmalla ja vielä vanhemmalla voisi kattoo miten binary toimisi :]

peki [27.03.2004 19:05:21]

#

En saa binarya lähetettyä ftp-palvelimelle. =(

Aku2 [28.03.2004 00:45:18]

#

Koneena on AMD athlon 2600+, Giga muistia ja ASUS RADEON 9200SE/T/128 MT ja tökkii, ei kuitenkaan pahasti. (Suoraan VB.NETistä ajettuna)
En ole kokeillut vielä kääntää exeksi ja ajaa sitä kautta.

peki [28.03.2004 11:24:47]

#

Touon |sin(2*pi*rect.y/1040) * (255 / 2)| kohdan sinin voisi korvata paraabelilla(y = x^2)! Hyvä optimointi!
Tietenkin suhteet pitää laskea uudelleen =(

Juhis [28.03.2004 16:56:57]

#

Turhaa hienostelua =)
Noin paljon koodia vaan jotta saadaan tekijät esille, turhaa

peki [28.03.2004 17:12:37]

#

No... ...Onhan tästä joillekin hyötyä. Oppiihan tästä vb .NET:n komentoja ja grafiikkaa ja starfield -efektin perusteet. Minusta ainakin on hirveän palauttavaa koodata hieman grafiikkaa vaikeiden skriptikieli ongelmien jälkeen, joten ongelmien jälkeen syntyy yleensä aina kaikkea hienoa. =)

Aku2 [28.03.2004 22:58:32]

#

Ei tuossa nyt hirveästi koodia ole ja käännetystä ei vie varmaankaan edes yhtä kilotavua.
Pieni pisara pelin kokonaiskoodimäärästä, on se peli sitten millainen tahansa. Ihan hyvä vinkki. Itse ainankin opin mm. miten tekstiä vieritetään pictureboxissa.

ErroR++ [26.09.2011 18:09:20]

#

Hieno!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta