Efektit

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
User avatar
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Efektit

Post by Wingman » Sat Jan 16, 2010 1:04 pm

koodaaja wrote:Kas, pitänee huomenna hieman pirteämpänä tutustua ja tehdä nopeustestejä, se vaikuttaisi olevan suunnilleen ellei peräti täsmälleen sama kaava kuin tämänhetkinen vähemmillä väliarvoilla.

Nuo nyt eivät ole mitään kovin kummoista, lentokoneella voi liikkua 2D-tasossa joka liikkuu vakionopeudella eteenpäin. Eiköhän tuosta joku väistely/ammuskelupeli tule.
olisi hyvä, jos pelissä olisi pelialue, ja kamera seuraisi konetta, jota voisi kääntää myös sivuttain tjsp.
- - - -

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Tue Jan 19, 2010 2:08 pm

Vapaasti siirtyilevä kamera rikkoisi suuren osan enginestä, jolloin koko homma olisi kirjoitettava alusta eikä siitä saisi enää lainkaan niin komeaa. Fysiikoidenkin säätämiseen saisi sopivaa tuskaa, joten jää ainakin toistaiseksi väliin. Mutta voihan sitäkin kokeilla kun taas on enemmän tyhjää aikaa (l. koeviikon jälkeen)

Tuossa viikonloppuna tuli hitmanien ohessa lisättyä maastoa.

Pitänee jaksaa tehdä ihan oma threadi tälle ettei mene efektit ihan täyteen näitä :> Kunhan saa vihollisia lisättyä.

User avatar
KillBurn
Advanced Member
Posts: 339
Joined: Wed Aug 29, 2007 5:02 pm

Re: Efektit

Post by KillBurn » Tue Jan 19, 2010 2:31 pm

koodaaja wrote:Vapaasti siirtyilevä kamera rikkoisi suuren osan enginestä, jolloin koko homma olisi kirjoitettava alusta eikä siitä saisi enää lainkaan niin komeaa. Fysiikoidenkin säätämiseen saisi sopivaa tuskaa, joten jää ainakin toistaiseksi väliin. Mutta voihan sitäkin kokeilla kun taas on enemmän tyhjää aikaa (l. koeviikon jälkeen)

Tuossa viikonloppuna tuli hitmanien ohessa lisättyä maastoa.

Pitänee jaksaa tehdä ihan oma threadi tälle ettei mene efektit ihan täyteen näitä :> Kunhan saa vihollisia lisättyä.
Tosi hieno, mutta kun ammuin niin Fps putosi 60:sta 30:een pysyvästi. Jatka ihmeessä peliksi asti.
Sumu Games: Sam, Ur eye!

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Thu Jan 21, 2010 8:55 pm

Jospa sitä taas jotain muutakin postaisi kuin 3D:tä. IFS-fraktaaleja innostuin renderöimään, valitettavasti nyky-CB:n tehot loppuu pahasti kesken.

Code: Select all

Const tfamo = 4
Const iter = 100000

Dim tf#(tfamo,5)

SCREEN 512, 512

For i = 0 To tfamo
    For j = 0 To 5
        tf(i, j) = Rnd(-1,1)
    Next j
Next i

curx# = 0
cury# = 0

begintime = Timer()

For i = 0 To iter
    If (i Mod 100) = 0 Then SetWindow Str(i/1000.0)+"%"
    use = Rand(tfamo)
    
    tmpx# = curx*tf(use, 0)+cury*tf(use, 2)+tf(use,4)
    tmpy# = curx*tf(use, 1)+cury*tf(use, 3)+tf(use,5)
    
    curx = tmpx: cury = tmpy
    
    PutPixel Int(curx*100)+256, Int(cury*100)+256, GetPixel(Int(curx*100)+256, Int(cury*100)+256)+20
Next i
Text 10, 10, "rdy in "+Str(Timer()-begintime)+"ms"
DrawScreen
WaitKey
Siitä vaan optimoimaan jos haluatte, oma into ei nyt oikein riitä (etenkään kun ohjelman C++-isoveli renderöi huomattavasti kauniimpia fraktaaleja sekunneissa)

User avatar
Someday coder
Active Member
Posts: 106
Joined: Wed Jul 30, 2008 5:04 pm

Re: Efektit

Post by Someday coder » Fri Jan 22, 2010 9:56 pm

Siinä nopeampi, mutta jostain syystä putpixel2 pukkasi mavia

Code: Select all

 Const tfamo = 4
    Const iter = 100000

    Dim tf#(tfamo,5)

    SCREEN 512, 512

    For i = 0 To tfamo
        For j = 0 To 5
            tf(i, j) = Rnd(-1,1)
        Next j
    Next i

    curx# = 0
    cury# = 0

    begintime = Timer()
    Lock SCREEN()
    For i = 0 To iter
        If (i Mod 100) = 0 Then SetWindow Str(i/1000.0)+"%"
        use = Rand(tfamo)
       
        tmpx# = curx*tf(use, 0)+cury*tf(use, 2)+tf(use,4)
        tmpy# = curx*tf(use, 1)+cury*tf(use, 3)+tf(use,5)
       
        curx = tmpx: cury = tmpy
       
        PutPixel Int(curx*100)+256, Int(cury*100)+256, GetPixel(Int(curx*100)+256, Int(cury*100)+256)+20
    Next i
    Unlock SCREEN()
    Text 10, 10, "rdy in "+Str(Timer()-begintime)+"ms"
    DrawScreen
    WaitKey 

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Efektit

Post by JATothrim » Fri Jan 22, 2010 10:20 pm

"Jostain syystä" eli luet/kirjoitat ruudun ulkopuolella. Vaihda: "PutPixel Int(curx*100)+256, Int(cury*100)+256, GetPixel(Int(curx*100)+256, Int(cury*100)+256)+20" tähän:

Code: Select all

dx% = Max(Min(511, Int(curx*100)+256),0)
dy% = Max(Min(511, Int(cury*100)+256),0)
PutPixel2 dx, dy, GetPixel(dx, dy)+20
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Fri Jan 22, 2010 10:41 pm

Kas, olisi selvästi kannattanut kokeilla putpixel2:takin, tuohan on selvästi nopeampi (niinhän se tosin on aina ollut). Voisi viritellä siitä vaikka ihan kunnon renderöijän.

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Sat Jan 23, 2010 4:21 pm

Anteeksi tuplat, mutta tuli sen verran tavaraa etten editoida halua.

Eli tein tuosta IFS-systeemistä ihan kunnollisen myös CB-puolella, siitä tuli ihan suhteellisen komea.

Code: Select all

Const tfamo = 4
Const iter = 1000000

Dim tf#(tfamo,5)

SCREEN 512, 512

redo:

Color 1, 1, 1

Box 0, 0, 512, 512

DrawScreen OFF

For i = 0 To tfamo
    For j = 0 To 5
        tf(i, j) = Rnd(-1,1)
    Next j
Next i

redness#  = Rnd(.7, .99)
blueness# = Rnd(.7, .99)
greenness#= Rnd(.7, .99)

roundness# = Rnd(0.0, 40.0)

curx# = 0
cury# = 0

begintime = Timer()
Lock SCREEN()
For i = 0 To iter
    If (i Mod 100) = 0 Then SetWindow Str((i/float(iter))*100.0)+"%"
    use = Rand(tfamo)
    
    tmpx# = curx*tf(use, 0)+cury*tf(use, 2)+tf(use,4)
    tmpy# = curx*tf(use, 1)+cury*tf(use, 3)+tf(use,5)
    
    curx = tmpx: cury = tmpy
    
    drawx# = 100*curx*Cos(roundness*curx)-100*cury*Sin(roundness*curx)
    drawy# = 100*curx*Sin(roundness*curx)+100*cury*Cos(roundness*curx)
    
    If(drawx>=-255 And drawx<255 And drawy>=-255 And drawy<255) Then
        
        col% = GetPixel2(drawx+256, drawy+256)
        
        r# = Float((col Shr 16) Mod 256)
        col = col - r
        g# = Float((col Shr 8) Mod 256)
        col = col - g
        b# = -Float(col Mod 256)
        
        r = 255-(255-r) * redness
        g = 255-(255-g) * blueness
        b = 255-(255-b) * greenness
        
        PutPixel2 drawx+256, drawy+256, (255 Shl 24) + (Int(r) Shl 16) + (int(g) Shl 8) + int(b)
        
    EndIf
Next i
Unlock
SetWindow "100.00% (in "+Str(Timer()-begintime)+"ms)"
DrawScreen
WaitKey
Goto redo
Lisäksi törmäsin hassuun Wikipedia-artikkeliin ja piirtelin hieman auringonkukkapatternia, tässä nyt ei sinänsä mitään muuta ihmeellistä ole kuin tuo matemaattinen kauneus.

Code: Select all

For n = 1 To 800
    Color 127+90*Cos(n*137.5), 127-90*Cos(n*137.5), 190-(n/800.0*190)
    Circle 200+4.5*Sqrt(n)*Cos(n*137.5), 150+4.5*Sqrt(n)*Sin(n*137.5), 4
Next n
DrawScreen
WaitKey

User avatar
Jare
Devoted Member
Posts: 867
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: Efektit

Post by Jare » Sat Jan 23, 2010 4:38 pm

Vau, hienoja nuo molemmat, koodaaja! :)
koodaaja wrote: Lisäksi törmäsin hassuun Wikipedia-artikkeliin ja piirtelin hieman auringonkukkapatternia, tässä nyt ei sinänsä mitään muuta ihmeellistä ole kuin tuo matemaattinen kauneus.
Pakkohan mun oli laittaa tuo pyörimään:

Code: Select all

rotate=0
Repeat
	rotate+1
	For n = 1 To 800
		Color 127+90*Cos(n*137.5+rotate), 127-90*Cos(n*137.5+rotate), 190-(n/800.0*190)
		Circle 200+4.5*Sqrt(n)*Cos(n*137.5+rotate), 150+4.5*Sqrt(n)*Sin(n*137.5+rotate), 4
	Next n
	DrawScreen
Forever

User avatar
Requiem for Anthrax
Active Member
Posts: 155
Joined: Wed Dec 03, 2008 9:17 pm
Location: Haukipudas

Re: Efektit

Post by Requiem for Anthrax » Sat Jan 23, 2010 5:29 pm

Jare wrote: Pakkohan mun oli laittaa tuo pyörimään:
No oli minunkin pakko hieaman pyörittää tota.

Code: Select all

rotate=0
movement=0
Repeat
   rotate+1
   movement+1
   If movement=360 Then movement=0
   For n = 1 To 800
      Color 127-90*Cos(n*137.5-rotate), 127+90*Cos(n*137.5+rotate*n), 190+(n/800.0*190)
      If n<400 Then 
        Circle 200+4.5*Sqrt(n)*Cos(n*137.5+rotate), 150+4.5*Sqrt(n)*Sin(n*137.5+rotate-movement*6), 4 
      ElseIf n>=400 And n<=600 Then 
        Circle 200+4.5*Sqrt(n)*Cos(n*137.5+rotate-movement), 150-4.5*Sqrt(n)*Sin(n*137.5+rotate), 4
      Else 
        Circle 200-4.5*Sqrt(n)*Cos(n*137.5+rotate+movement*2), 150+4.5*Sqrt(n)*Sin(n*137.5+rotate), 4
      EndIf
   Next n
   DrawScreen
Forever
Turmankylä
huonoja pelejä, purkkaisia viritelmiä, tylsiä tarinoita.

User avatar
Ruuttu
Devoted Member
Posts: 687
Joined: Thu Aug 30, 2007 5:11 pm
Location: Finland, Sipoo

Re: Efektit

Post by Ruuttu » Sun Jan 24, 2010 3:49 pm

Hieman erilainen savuefekti:

Code: Select all

SCREEN 800,600

map = LoadMap("Media\testmap.til","Media\tileset.bmp")

cannon = LoadObject("Media\cannon.bmp",180) : ObjectOrder cannon, 1
turret = LoadObject("Media\turret.bmp")
bullet = LoadObject("Media\bigbullet.bmp",180) : ShowObject bullet,OFF 

PositionObject turret,0,-160
PositionObject cannon,0,-160
RotateObject cannon,90

Type BULLETS
    Field obj
EndType

Type SMOKE
    Field X As Float
    Field Y As Float
    Field OFFX
    Field OFFY
    Field SIZE As Float
    Field SPEED
    Field SPEED2 As Float
    Field ANG
    Field DELSIZE
EndType

// VAKIONOPEUSAJASTIMET - SDK:sta lyhennetty versio
Global g_frameTime As Float
g_frameTime = 0.0
Global g_tmpTime As Integer
g_tmpTime = 0

Function PxPerSec(px#)
    Return px# * g_frameTime
End Function

Function UpdateFrameTimer()
    curTime = TIMER()
    If g_tmpTime = 0 Then g_tmpTime = curTime
    g_frameTime = (curTime - g_tmpTime) / 1000.0
    g_tmpTime = curTime
End Function
// END OF: VAKIONOPEUSAJASTIMET

Repeat

    UpdateFrameTimer()

    If KeyDown(cbkeyleft) Then TurnObject cannon,PxPerSec(120)
    If KeyDown(cbkeyright) Then TurnObject cannon,PxPerSec(-120)
    If ObjectAngle(cannon) < 30 Then RotateObject cannon, 30
    If ObjectAngle(cannon) > 150 Then RotateObject cannon, 150

    If KeyHit(cbkeyspace) Then 
        NewBullet.BULLETS = New(BULLETS)
        NewBullet\obj = CloneObject(bullet)
        PositionObject NewBullet\obj,0,-160
        RotateObject NewBullet\obj,ObjectAngle(cannon)
        MoveObject NewBullet\obj,24
        SetupCollision NewBullet\obj,map,2,4,2
    EndIf
    
    For iBULLET.BULLETS = Each BULLETS
        Del = 0
        MoveObject iBullet\obj,PxPerSec(240)
        
        // LISÄTÄÄN SAVUA
        // X, Y, Kulma, Partikkelien määrä, Liikenopeus, MaxKoko, MinKoko, Pienenemisen nopeus
        X = ObjectX(iBullet\obj)           // Mihin kohtaan savua luodaan, X
        Y = ObjectY(iBullet\obj)           // Mihin kohtaan savua luodaan, Y
        ANGLE = ObjectAngle(iBullet\obj)   // Missä kulmassa savu on, eli mihin suuntaan se liikkuu
        AMOUNT = PxPerSec(160)             // Montako savupartikkelia luodaan (esim. 160 sekunnissa)
        MIN_SPEED = 40                     // Millä nopeudella savupartikkelit liikkuvat, minimi
        MAX_SPEED = 50                     // Millä nopeudella savupartikkelit liikkuvat, maksimi
        MAX_SIZE = 10                      // Mikä on luotujen savupartikkelien maksimikoko
        MIN_SIZE = 5                       // Mikä on luotujen savupartikkelien minimikoko
        SIZE_DECREASE = 15                 // Millä nopeudella savupartikkelit kutistuvat (esim. 15 pikseliä sekunnissa)
        OFFSET = 3                         // Paljonko luotujen savupartikkelien sijaintia sekoitetaan (jotta kaikki X luotua partikkelia eivät ole ihan samassa kohtaa)
        OFFSET2 = 5                        // Paljonko partikkelit sekoittavat kuvaa
        ANGOFF = 25                        // Paljonko yksittäisen partikkelin kulma voi poiketa annetusta kulmasta (jotta kaikki X luotua partikkelia eivät ole ihan samassa kulmassa)
        DELSIZE = 3                        // Kuinka pieneksi partikkeli saa kutistua, ennen kuin se poistetaan  
        
        AddSmoke(X, Y, ANGLE, AMOUNT, MIN_SPEED, MAX_SPEED, MAX_SIZE, MIN_SIZE, SIZE_DECREASE, OFFSET, OFFSET2, ANGOFF, DELSIZE)
        
        If CountCollisions(iBullet\obj) Then Del = 1
        If Del = 1 Then DeleteObject iBullet\obj : Delete iBullet
    Next iBULLET
    
    DrawGame
    UpdateSmoke()

DrawScreen
Forever

Function AddSmoke(X,Y,ANG,AMOUNT,MIN_SPEED,MAX_SPEED,MAXSIZE,MINSIZE,SPEED2,OFFSET,OFFSET2,ANGOFF = 25, DELSIZE = 2)
    For I = 1 To AMOUNT
        NewSmoke.SMOKE = New(SMOKE)
        NewSmoke\X = X + Rand(-OFFSET,OFFSET)
        NewSmoke\Y = Y + Rand(-OFFSET,OFFSET)
        NewSmoke\ANG = ANG + Rand(-ANGOFF,ANGOFF)
        NewSmoke\SIZE = Rand(MINSIZE,MAXSIZE)
        NewSmoke\OFFX = Rand(-OFFSET2,OFFSET2)
        NewSmoke\OFFY = Rand(-OFFSET2,OFFSET2)
        NewSmoke\SPEED = Rand(MIN_SPEED,MAX_SPEED)
        NewSmoke\SPEED2 = SPEED2
        NewSmoke\DELSIZE = DELSIZE
    Next I
EndFunction

Function UpdateSmoke()

    SWCX = ScreenWidth()/2-CameraX()
    SWCY = ScreenHeight()/2+CameraY()

    Color 32,32,32

    For iSmoke.SMOKE = Each SMOKE

        X = iSmoke\X-(ISmoke\Size/2)
        Y = iSmoke\Y-(ISmoke\Size/2)
        
        Dot X+SWCX,-Y+SWCY // Tämän voi vapaasti poistaa
        
        CopyBox Int(X+SWCX - iSmoke\OffX),Int(-Y+SWCY - iSmoke\OffY),Int(iSmoke\SIZE),Int(iSmoke\SIZE),X, -Y, SCREEN(),SCREEN()
        
        iSmoke\X = iSmoke\X + Cos(iSmoke\ANG)*PxPerSec(iSmoke\SPEED)
        iSmoke\Y = iSmoke\Y + Sin(iSmoke\ANG)*PxPerSec(iSmoke\SPEED)
        
        iSmoke\SIZE = iSmoke\SIZE - PxPerSec(iSmoke\SPEED2)
        
        If iSmoke\SIZE < iSmoke\DELSIZE Then Delete iSmoke
    
    Next iSmoke
EndFunction
Last edited by Ruuttu on Sun Jan 24, 2010 7:25 pm, edited 1 time in total.

User avatar
Jare
Devoted Member
Posts: 867
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: Efektit

Post by Jare » Sun Jan 24, 2010 4:12 pm

Requiem for Anthrax wrote:
Jare wrote: Pakkohan mun oli laittaa tuo pyörimään:
No oli minunkin pakko hieaman pyörittää tota.
Pyöritetään nyt ihmeessä lisää.

Code: Select all

rotate=0
movement=0
Repeat
   rotate+1
   movement+1
   If movement=360 Then movement=0
   For n = 1 To 800
      Color 127-90*Cos(n*137.5-rotate), 127+90*Cos(n*137.5+rotate*n), 190+(n/800.0*190)
      If n<400 Then 
        Circle 200+4.5*Sqrt(n)*Cos(n*137.5+rotate)*Tan(movement)+Cos(rotate)*200, 150+4.5*Sqrt(n)*Sin(n*137.5+rotate-movement*6)*Tan(movement)-Sin(rotate)*200, 4 
      ElseIf n>=400 And n<=600 Then 
        Circle 200+4.5*Sqrt(n)*Cos(n*137.5+rotate-movement)*Tan(movement)+Cos(rotate)*200, 150-4.5*Sqrt(n)*Sin(n*137.5+rotate)*Tan(movement)-Sin(rotate)*200, 4
      Else 
        Circle 200-4.5*Sqrt(n)*Cos(n*137.5+rotate+movement*2)*Tan(movement)+Cos(rotate)*200, 150+4.5*Sqrt(n)*Sin(n*137.5+rotate)*Tan(movement)-Sin(rotate)*200, 4
      EndIf
   Next n
   DrawScreen
Forever

User avatar
Substance
Active Member
Posts: 234
Joined: Fri Mar 14, 2008 6:48 pm

Re: Efektit

Post by Substance » Thu Jan 28, 2010 7:07 pm

Koodaajan ansiosta opin vähän kolmedeetä, ja minun ansiostani saatte tällaisen hienon kuution mitä heitellä ympäriinsä. Käännä kameraa WASDista(R resetoi), hiiren rullalla liikut edemmäs/kauemmas ja vektoreista voit tarttua hiirellä.

Code: Select all

SCREEN 800,600

Const screenwd2 = 400
Const screenhd2 = 300

Const GRAVITY = 0.1

Const _curX = 5
Const _curY = 6
Const _curZ = 7
Const _preX = 8
Const _preY = 9
Const _preZ = 10
Dim vect(11,10) As Float
Dim tri(11,4) As Integer
Dim distances(7,7) As Float

settri(0,0,4,2):settri(1,0,1,4):settri(2,0,2,1):settri(3,6,2,4):settri(4,6,4,7):settri(5,6,7,2)
settri(6,3,7,1):settri(7,3,1,2):settri(8,3,2,7):settri(9,5,1,7):settri(10,5,4,1):settri(11,5,7,4)

For i = 0 To 7
    vect(i,0) = -20 + 40*(i<4)
    vect(i,1) = -20 + 40*((i Mod 2) = 0)
    vect(i,2) = -20 + 40*( i = 0 Or i = 1 Or i = 4 Or i = 5 )
    vect(i,_curX) = vect(i,0)
    vect(i,_curY) = vect(i,1)
    vect(i,_curZ) = vect(i,2)
    vect(i,_preX) = vect(i,0)
    vect(i,_preY) = vect(i,1)
    vect(i,_preZ) = vect(i,2)
Next i

For i = 8 To 11 
    vect(i,0)  =  90 - 180 * (i = 8 Or i = 11)
    vect(i,1)  = -90
    vect(i,2)  =  90 - 180 * (i = 10 Or i = 11)
    vect(i,_curX) = vect(i,0)
    vect(i,_curY) = vect(i,1)
    vect(i,_curZ) = vect(i,2)
Next i

For i = 0 To 7
    For i2 = 0 To 7
        distances(i,i2) = Sqrt((vect(i,0)-vect(i2,0))^2 + (vect(i,1)-vect(i2,1))^2 + (vect(i,2)-vect(i2,2))^2)
    Next i2
Next i


Function SetTri(i,v1,v2,v3)
    tri(i,0) = v1
    tri(i,1) = v2
    tri(i,2) = v3
End Function

Function project(i)
   
    p_s# = (1/vect(i,2))*screenwd2
   
    vect(i,3) = (vect(i,0) * p_s#) + screenwd2
    vect(i,4) = (vect(i,1) * p_s#) + screenhd2
   
End Function

Function rotate( i, x#, y#, z#, ang# )

    sin_a# = Sin( ang/2 )
    qx# = x * sin_a
    qy# = y * sin_a
    qz# = z * sin_a
    qw# = Cos( ang/2 )

    xx# = (vect(i,0) * (1 -(2 * (qy^2)) -(2 * (qz^2)) )) + (vect(i,1) * (2 * qx * qy - 2 * qz * qw))      + (vect(i,2) * (2 * qx * qz + 2 * qy * qw))
    yy# = (vect(i,0) * (2 * qx * qy + 2 * qz * qw))      + (vect(i,1) * (1 -(2 * (qx^2)) -(2 * (qz^2)) )) + (vect(i,2) * (2 * qy * qz - 2 * qx * qw))
    zz# = (vect(i,0) * (2 * qx * qz - 2 * qy * qw))      + (vect(i,1) * (2 * qy * qz + 2 * qx * qw))      + (vect(i,2) * (1 -(2 * (qx^2)) -(2 * (qy^2)) ))

    vect(i,0) = xx
    vect(i,1) = yy
    vect(i,2) = zz
   
End Function


Function CalculateNewVectorPosition(i)
    For p = 5 To 7
        temp# = vect(i, p)
        vect(i, p) = 2 * vect(i, p) - (vect(i, p + 3) + (vect(i, p)-vect(i, p + 3)) * 0.01 ) - GRAVITY * (p = 6)
        vect(i, p + 3) = temp#
    Next p
EndFunction


Function SustainDistance(i,i2,distanceToSustain#)
    
    xDist# = (vect(i,_curX) - vect(i2,_curX))
    yDist# = (vect(i,_curY) - vect(i2,_curY))
    zDist# = (vect(i,_curZ) - vect(i2,_curZ))

    curDist# = Sqrt(xDist#^2+yDist#^2+zDist#^2)
    multiplier# = (curDist# - distanceToSustain#) / curDist#

    vect(i,_curX) = vect(i,_curX) - xDist# * 0.5 * multiplier#
    vect(i,_curY) = vect(i,_curY) - yDist# * 0.5 * multiplier#
    vect(i,_curZ) = vect(i,_curZ) - zDist# * 0.5 * multiplier#
    vect(i2,_curX) = vect(i2,_curX) + xDist# * 0.5 * multiplier#
    vect(i2,_curY) = vect(i2,_curY) + yDist# * 0.5 * multiplier#
    vect(i2,_curZ) = vect(i2,_curZ) + zDist# * 0.5 * multiplier#
    
EndFunction


Color cbWhite
position# = 150 //viewing distance

Repeat
    
    xang = WrapAngle(xang + KeyDown(31) - KeyDown(17))
    yang = WrapAngle(yang + KeyDown(30) - KeyDown(32))
    zang = WrapAngle(zang + KeyDown(18) - KeyDown(16))
    position# = position# - MouseMoveZ() * 10
   
    If KeyHit(cbKeyR) Then xang = 0 : yang = 0 : zang = 0 : position = 150
   
    For i = 0 To 11
        vect(i,0) = vect(i,5)
        vect(i,1) = vect(i,6)
        vect(i,2) = vect(i,7)
    Next i
    
    For i = 0 To 7
        rotate( i, 1, 0, 0, xang )
        rotate( i, 0, 1, 0, yang )
        rotate( i, 0, 0, 1, zang )
       
        vect(i,2) = vect(i,2) - position#
        project(i)
        vect(i,2) = vect(i,2) + position#
    Next i
    
    //viivat
    Lock
    For i = 0 To 11
        If (((vect(tri(i,1),3) - vect(tri(i,0),3) ) * (vect(tri(i,2),4) - vect(tri(i,0),4)) - (vect(tri(i,2),3) - vect(tri(i,0),3)) * (vect(tri(i,1),4) - vect(tri(i,0),4))) <= 0) Then
            Line vect(tri(i,0),3), vect(tri(i,0),4), vect(tri(i,1),3), vect(tri(i,1),4)
            Line vect(tri(i,1),3), vect(tri(i,1),4), vect(tri(i,2),3), vect(tri(i,2),4)
            Line vect(tri(i,2),3), vect(tri(i,2),4), vect(tri(i,0),3), vect(tri(i,0),4)
        EndIf
    Next i
    Unlock
    

    For i = 0 To 7
    
        s = Max((vect(i,2)+100) / 20 / (position#/400),1)
        'Circle vect(i,3) - s * 0.5, vect(i,4) - s * 0.5, s
        'Text vect(i,3), vect(i,4), i
        If Distance(MouseX(),MouseY(),vect(i,3), vect(i,4)) < s Then
            Circle vect(i,3) - s, vect(i,4) - s, s * 2, 0
            If MouseDown(1) And moving = 0 Then moved = i : moving = 1
        EndIf
        
        If moved = i And moving = 1 Then
            vect(i,_curX) = vect(i,_curX) + (vect(i,3)-MouseX()) * (position#/400) * Cos(yang) * 0.1
            vect(i,_curZ) = vect(i,_curZ) + (vect(i,3)-MouseX()) * (position#/400) * Sin(yang) * 0.1
            vect(i,_curY) = vect(i,_curY) + (vect(i,4)-MouseY()) * (position#/400) * Cos(xang) * 0.1
            If MouseDown(1) = 0 Then moving = 0
        EndIf
        
         //lasketaan seuraavat koordinaatit
        CalculateNewVectorPosition(i)
        If Abs(vect(i,_curY)) > 90 Then //LATTIAAN KITKA
            vect(i,_curX) = vect(i,_curX) - (vect(i,_curX) - vect(i,_preX))* 0.1
            vect(i,_curZ) = vect(i,_curZ) - (vect(i,_curZ) - vect(i,_preZ))* 0.1
        EndIf
        If Abs(vect(i,_curX)) > 90 Then //SIVUSEINIIN KITKA
            vect(i,_curY) = vect(i,_curY) - (vect(i,_curY) - vect(i,_preY))* 0.1
            vect(i,_curZ) = vect(i,_curZ) - (vect(i,_curZ) - vect(i,_preZ))* 0.1
        EndIf
        If Abs(vect(i,_curZ)) > 90 Then //ETU- JA TAKASEINÄÄN KITKA
            vect(i,_curX) = vect(i,_curX) - (vect(i,_curX) - vect(i,_preX))* 0.1
            vect(i,_curY) = vect(i,_curY) - (vect(i,_curY) - vect(i,_preY))* 0.1
        EndIf
        vect(i,_curX) = Min(Max(vect(i,_curX),-90),90)
        vect(i,_curY) = Min(Max(vect(i,_curY),-90),90)
        vect(i,_curZ) = Min(Max(vect(i,_curZ),-90),90)
        
    Next i
    
    For i = 0 To 7 //sidokset
        For i2 = i + 1 To 7
            If i <> i2 Then SustainDistance(i,i2,distances(i,i2))
        Next i2
    Next i
    
    For i = 8 To 11
        rotate( i, 1, 0, 0, xang )
        rotate( i, 0, 1, 0, yang )
        rotate( i, 0, 0, 1, zang )
        
        vect(i,2) = vect(i,2) - position#
        project(i)
        vect(i,2) = vect(i,2) + position#
    Next i
    
    For i = 8 To 11
        i2 = i + 1
        If i = 11 Then i2 = 8
        Line vect(i,3), vect(i,4), vect(i2,3), vect(i2,4)
    Next i
    
    DrawScreen
Forever
EDIT:

Korjattu

Last edited by Substance on Thu Jan 28, 2010 10:00 pm, edited 2 times in total.
Substance aka LittleGreen
Red Encounter - shoot'em uppia - lataus

User avatar
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Efektit

Post by Viltzu » Thu Jan 28, 2010 8:37 pm

LittleGreen wrote:Koodaajan ansiosta opin vähän kolmedeetä, ja minun ansiostani saatte tällaisen hienon kuution mitä heitellä ympäriinsä. Käännä kameraa WASDista(R resetoi), hiiren rullalla liikut edemmäs/kauemmas ja vektoreista voit tarttua hiirellä.
Amazing physics. Very nice... and so on... :P
Mutta kyllä, tuo on hieno. Paljon en kyllä testaillut. Tuli muuta.
Last edited by Viltzu on Thu Jan 28, 2010 10:02 pm, edited 1 time in total.

MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Efektit

Post by MrMonday » Thu Jan 28, 2010 9:27 pm

LittleGreen wrote:Koodaajan ansiosta opin vähän kolmedeetä, ja minun ansiostani saatte tällaisen hienon kuution mitä heitellä ympäriinsä. Käännä kameraa WASDista(R resetoi), hiiren rullalla liikut edemmäs/kauemmas ja vektoreista voit tarttua hiirellä.
Wau, On kyllä hieno :)

User avatar
Substance
Active Member
Posts: 234
Joined: Fri Mar 14, 2008 6:48 pm

Re: Efektit

Post by Substance » Thu Jan 28, 2010 10:00 pm

Oikeastaan vektoreiden sidokset olivat ihan väärin :lol:, mutta nyt fysiikat on korjattu ja kuutio käyttäytyy luontevammin.
Substance aka LittleGreen
Red Encounter - shoot'em uppia - lataus

User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Efektit

Post by CCE » Fri Jan 29, 2010 12:48 am

LittleGreen wrote:Koodaajan ansiosta opin vähän kolmedeetä...
Mahtava! Vilpittömimmät onnitteluni.

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Efektit

Post by koodaaja » Fri Jan 29, 2010 1:08 am

Kas, sehän on varsin komea viritelmä, itse en ole koskaan jaksanut 3D-physiikkaa CB:llä tehdä vaikka silloin tällöin olen ajatellut. Fiktiivinen hatunnosto.

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Efektit

Post by JATothrim » Fri Jan 29, 2010 1:16 am

LittleGreen wrote:Koodaajan ansiosta opin vähän kolmedeetä, ja minun ansiostani saatte tällaisen hienon kuution mitä heitellä ympäriinsä. Käännä kameraa WASDista(R resetoi), hiiren rullalla liikut edemmäs/kauemmas ja vektoreista voit tarttua hiirellä.

Code: Select all

..blöllöö..
EDIT:

Korjattu

Vau. :shock:
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

User avatar
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Efektit

Post by Wingman » Fri Jan 29, 2010 6:37 pm

LittleGreen wrote:Koodaajan ansiosta opin vähän kolmedeetä, ja minun ansiostani saatte tällaisen hienon kuution mitä heitellä ympäriinsä...
Ei että, mitäköän tästä tulee jos jo ennen CBClassicia tällasia tedään, en uskalla ees kuvitella! WAU :shock:
- - - -

Post Reply