Antti Laaksosen Veden virtaus -efekti, mutta tässä vettä tulee kokoajan lisää ja lisää joten tämä on loputon kiertokulku (paitsi sitten kun keskusmuisti loppuu :).
Screen 13 '$DYNAMIC ' Tarvitaan että taulukoita voi alustaa uudelleen ' REDIM funktiolla DefInt A-Z ' Tämä nopeuttaa toimintaa... Type kohta x As Integer y As Integer s As Integer End Type 'pisaroita alussa Max = 1000 'montako pisaraa lisäytyy lisays = 100 'montako kierrosta ennen lisäystä kierroksia = 100 'jos haluat vesisateen, laita sade=1, jos et laita sade=0 sade = 0 ' -> Jos haluat vesisateen, laita vaikka lisays=30 ja kierroksia=50 ja sade=1 'pisarataulukko Dim vesi(1 To Max) As kohta Dim temp(1 To Max) As kohta 'pisaroiden alkukohdat Randomize Timer vkohta = 0 For i = 1 To Max vesi(i).x = 8 + Int(Rnd * 3) + 1 vkohta = vkohta - 0.1 'mitä pienempi, sen vuolaampi vesi(i).y = vkohta Next counteri = 0 'maaston piirtäminen pii = 4 * Atn(1) Line (5, 50)-(100, 70) Line (101, 80)-(81, 100) Line (101, 80)-(141, 120) Line (70, 100)-(70, 120) Line (90, 100)-(90, 120) Line (70, 120)-(90, 120) Circle (135, 140), 10 Circle (135, 140), 14, 15, pii, 2 * pii - pii / 1.5 Line (135, 140)-(135, 130), 0 Line (135, 140)-(120, 140), 0 Line (136, 130)-(170, 100) PSet (70, 114), 0 Line (50, 130)-(100, 150) Circle (110, 100), 118, , pii, 2 * pii Do For i = 1 To Max 'vanha pisara pois PSet (vesi(i).x, vesi(i).y), 0 vx = vesi(i).x: vy = vesi(i).y If Point(vesi(i).x, vesi(i).y + 1) <= 0 Then vesi(i).y = vesi(i).y + 1 'jos alhaalla on tyhjää Else 'vasemman ja oikean puolen tilan laskeminen av% = 0: ao% = 0 For j = vesi(i).y To 320 If Point(vesi(i).x - 1, j) <= 0 Then av% = av% + 1 Else Exit For End If Next For j = vesi(i).y To 320 If Point(vesi(i).x + 1, j) <= 0 Then ao% = ao% + 1 Else Exit For End If Next If av% = 0 And ao% = 0 Then 'pisara ei pääse liikkumaan ElseIf av% >= 1 And ao% = 0 Then vesi(i).x = vesi(i).x - 1 'oikealle ei pääse: siis vasemmalle ElseIf ao% >= 1 And av% = 0 Then vesi(i).x = vesi(i).x + 1 'vasemmalle ei pääse: siis oikealle Else 'molemmat suunnat mahdollisia If vesi(i).s = 0 Then 'vesi on tulossa ylhäältä, suunta arvotaan vesi(i).x = vesi(i).x + (-1 + Int(Rnd * 3)) ElseIf vesi(i).s = 1 Then 'vesi on tulossa oikealta: siis vasemmalle vesi(i).x = vesi(i).x - 1 ElseIf vesi(i).s = 2 Then 'vesi on tulossa vasemmalta: siis oikealle vesi(i).x = vesi(i).x + 1 End If End If End If 'uuden suunnan laskeminen If vy <> vesi(i).x Then vesi(i).s = 0 If vx < vesi(i).x Then vesi(i).s = 2 If vx > vesi(i).x Then vesi(i).s = 1 'uuden pisaran piirtäminen PSet (vesi(i).x, vesi(i).y), 1 Next If counteri = kierroksia Then counteri = 0 ReDim temp(1 To Max) As kohta For i = 1 To Max temp(i).x = vesi(i).x temp(i).y = vesi(i).y Next i oldmax = Max Max = Max + lisays vkohta = 0 ReDim vesi(1 To Max) As kohta For i = 1 To oldmax vesi(i).x = temp(i).x vesi(i).y = temp(i).y Next i For i = (oldmax - 1) To Max If sade = 1 Then vesi(i).x = Int(Rnd * 200) Else vesi(i).x = 8 + Int(Rnd * 3) + 1 End If vkohta = vkohta - 0.1 'mitä pienempi, sen vuolaampi vesi(i).y = vkohta Next Else counteri = counteri + 1 End If Loop While INKEY$ <> Chr$(27)
Niin, tässä on sitten myös "vesisade" toiminto :)
Että tästäkin voi laittaa kyllä kommentteja...
Tässä osa pisaroista saattaa jäädä ilmaan, muuten tämä on hieno.
Aihe on jo aika vanha, joten et voi enää vastata siihen.