Salama efektiä?

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Someday coder
Active Member
Posts: 106
Joined: Wed Jul 30, 2008 5:04 pm

Salama efektiä?

Post by Someday coder »

Joskus näin täällä foorumeilla sellaisen hyvän efektin, mutta se on hävinnyt jonnekkin. Että oisko kellään sellaista funktiota joka piirtää salaman pisteestä A pisteeseen B. Alempana oma pikku säätö jossa fps ei ole mitenkään pelikelpoista (ihan tarkoituksella noin monta salamaa).

Code: Select all

Repeat

light(0,10,MouseX(),MouseY(),Rnd(0.4,1))
light(50,10,MouseX(),MouseY(),Rnd(0.4,1))
light(100,10,MouseX(),MouseY(),Rnd(0.4,1))
light(150,10,MouseX(),MouseY(),Rnd(0.4,1))
light(200,10,MouseX(),MouseY(),Rnd(0.4,1))
light(250,10,MouseX(),MouseY(),Rnd(0.4,1))
light(300,10,MouseX(),MouseY(),Rnd(0.4,1))
light(350,10,MouseX(),MouseY(),Rnd(0.4,1))
light(400,10,MouseX(),MouseY(),Rnd(0.4,1))

SetWindow ""+FPS()

DrawScreen
Forever 

Function light(x1,y1,x2,y2,p#)
Color p#*255,0,p#*255

vx#=x1+Cos(GetAngle(x1, y1, x2, y2)+Rnd(-0.3,0.3))*Rand(5,15)
vy#=y1-Sin(GetAngle(x1, y1, x2, y2)+Rnd(-0.3,0.3))*Rand(5,15)
Line x1,y1,vx#,vy#

While 1
 x#=vx#+Cos(GetAngle( vx, vy, x2, y2)+Rnd(-0.3,0.3))*Rand(5,15)
 y#=vy#-Sin(GetAngle( vx, vy, x2, y2)+Rnd(-0.3,0.3))*Rand(5,15)
 Line vx#,vy#,x#,y#
 vx#=x#
 vy#=y#
 If Distance(x#,y#,x2,y2) < 5 Then Goto loppu
Wend
loppu:
EndFunction
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Salama efektiä?

Post by Jonez »

Totuus on, että kunnolliseen salama-efektiin tarvitset piirtokomentoja, todennäköisesti line-komentoa, eivätkä nämä ole cb:ssä ikinä häikäisseet nopeudellaan.

Mutta... Jos pidät sähkötyksen pienissä lukemissa, voit saada sen toimivaan normaaleilla nopeuksilla. Tein pikaisen sähkötys-funktion, jolla voi sähkötellä vain tietynlaisia tolppia (itse funktio ei ole näihin rajattu, mutta funktion käyttö koodissa on). Sähkö luodaan seuraavien tietojen avulla:

SÄHKÖ_PITUUS: kertoo kuinka pitkälle voi sähköttää. Huomaa: mitä pidempi, sitä suuremmalla todennäköisyydellä sähkötetään useampia kappaleita, ja peli voi hidastua.

KULMA_MUUTOS: kuinka suuria kulma-muutoksia sähkö voi tehdä. Suuremmat lukemat voivat näyttää aidommilta, mutta ne pistävät sähkön kulkemaan hieman pidempiä matkoja, joka johtaa useampaan line-komentoon -> hidastuminen.

S_KOKO: kuinka monta pikseliä yksi line-komento on. Luonnollisesti suuremmat luvut auttavat sähköä pääsemään kohteeseensa nopeammin, eli vähentävät line-komentoja ja kasvattavat suorituskykyä.

Myös liian monta tolppaa saattavat hidastuttaa peliä sähkötyksen aikana.

Code: Select all

SCREEN 800, 600

Const TOLPPAMÄÄRÄ = 10   //kuinka monta tolppaa pelissä ON.
Const SÄHKÖ_PITUUS = 200 //tyhmä nimi. Muuttuja kertoo kuinka pitkälle sähkö voi "hypätä"
Const KULMA_MUUTOS = 30 //mitä suurempi arvo, sitä hitaampi funktio, mutta terävämmät kulmat.
Const S_KOKO = 5        //<- mitä suurempi arvo, sitä nopeampi funktio, mutta pidemmät (ja siksi ehkä suoremmat) viivat.

Dim tolpat( TOLPPAMÄÄRÄ, 2 )

//tolpat( x, 0 ) = x-akseli
//tolpat( x, 1 ) = y-akseli
//tolpat( x, 2 ) = onko tolpassa sähköä (voi sähkötellä muita tolppia)

//Luodaan tolpat
For i = 0 To TOLPPAMÄÄRÄ
    tolpat( i, 0 ) = Rand( 0, ScreenWidth() )
    tolpat( i, 1 ) = Rand( 0, ScreenHeight() )
Next i

Repeat
    
    //Hiiren 1-nappula antaa käskyn sähköttää.
    If MouseDown( 1 ) Then
        sähkötä = True
    Else
        sähkötä = False
    EndIf
    
    //käydään tolpat läpi. Vain nämä johtavat sähköä.
    For i = 0 To TOLPPAMÄÄRÄ
        _x = tolpat( i, 0 ) - 2 //koordinaatit
        _y = tolpat( i, 1 ) - 2    
        
        //jos on annettu käsky sähköttää
        If sähkötä Then
            //tarkastetaan onko tolppa tarpeeksi lähellä. Jos on, sähkötetään sitä.
            If Distance( MouseX(), MouseY(), _x, _y ) <= SÄHKÖ_PITUUS Then
                Zap( MouseX(), MouseY(), _x, _y )
                tolpat( i, 2 ) = 1  //laitetaan tolppa "sähkötetyksi"
            Else
                tolpat( i, 2 ) = 0  //jos ei tarpeeksi lähellä, lopetetaan sähkötys.
            EndIf
        Else
            tolpat( i, 2 ) = 0  //lopetetaan tolppien sähkötys jos päävirta on pois.
        EndIf
        
        //käydään sähkötetyt tolpat läpi ja sähkötetään viereiset, ei-sähkötetyt tolpat.
        If tolpat( i, 2 ) = 1 Then
            For a = 0 To TOLPPAMÄÄRÄ
                //tarkastetaan ettei ole sähköttävä tolppa, ja että kohdetolppa ei sähkötä (koska muutoin
                //sähkötystä tapahtuu kahteen suuntaan, jota ei sallita)
                If i <> a And tolpat( a, 2 ) = 0 Then
                    _x2 = tolpat( a, 0 )
                    _y2 = tolpat( a, 1 )
                    If Distance( _x, _y, _x2, _y2 ) < SÄHKÖ_PITUUS Then
                        Zap( _x, _y, _x2, _y2 )
                    EndIf
                EndIf
            Next a
        EndIf
        
        Color cbWhite
        Circle _x, _y, 4    //piirretään tolppa
    Next i

    Text 20, 20, FPS()
    DrawScreen
Forever

//Sähkötys-funktio
Function Zap( _sx, _sy, _ex, _ey )
    _x# = _sx
    _y# = _sy
    Color cbLightBlue
    While True
        _kulma# = GetAngle( _x, _y, _ex, _ey ) + Rand( -KULMA_MUUTOS, KULMA_MUUTOS )
        _oldx = _x
        _oldY = _y
        
        _x = _x + Cos( _kulma ) * S_KOKO
        _y = _y - Sin( _kulma ) * S_KOKO
        
        Line _oldx, _oldy, _x, _y
        
        If Distance( _x, _y, _ex, _ey ) < 20 Then
            Line _x, _y, _ex, _ey
            Exit
        EndIf
    Wend   
EndFunction
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Someday coder
Active Member
Posts: 106
Joined: Wed Jul 30, 2008 5:04 pm

Re: Salama efektiä?

Post by Someday coder »

Itse asiassa juuri tuollaista tarvitsinkin peliini, ja pitää jotenkin kikkailla että fps pysyisi siellä 40+
Post Reply