Ohjelma simuloi veden virtausta, valumista, tippumista, aaltoilua, ja kaikenlaisia muita liikkeitä. Taulukossa on varattu tila veden jokaiselle pisaralle (pikselille), joita ohjelma liikuttaa kutakin erikseen. Niitä on yhteensä 4000. Kaksi pisaraa ei voi liikkua toisensa päälle, joten jos iso määrä pisteitä törmää yhteen ne järjestäytyvät isoksi vesimassaksi ja muodostavat niin sileän pinnan kuin mahdollista. Kokeile itse niin näet.
Edit 2019 by mod: Vaihdettu nopeuden säätöön TIMER, niin vinkki toimii myös nykyisillä koneilla ja FreeBASICilla.
SCREEN 13 'kokonaisluvut käyttöön DEFINT A-Z 'pisaroiden määrä ja tiedot drops = 3999 DIM drop(3999, 3) FOR a = 0 TO drops 'arvotaan x ja y drop(a, 0) = INT(RND * 320) drop(a, 1) = INT(RND * 50) NEXT a 'piirretään esteitä CIRCLE (10, 100), 140, , , , .5 CIRCLE (309, 100), 140, , , , .5 LINE (0, 199)-(159, 169) LINE (160, 169)-(319, 199) t# = TIMER DO t# = t# + 0.015 WHILE TIMER < t#: WAIT &h3da, &h8: WEND FOR a = 0 TO drops 'kumita pisara edellisestä paikasta PSET (drop(a, 0), drop(a, 1)), 0 IF POINT(drop(a, 0), drop(a, 1) + 1) = 0 THEN 'jos alapuolella tyhjää, liikuta pisaraa alaspäin drop(a, 1) = drop(a, 1) + 1 ELSE IF drop(a, 2) <> 0 THEN 'jos pisaran virtaussuunta on määritelty (ei ole 0, vaan 1 tai -1), 'pistetään muistiin x tällä hetkellä, liikutetaan pisaraa virtaussuuntaan x = drop(a, 0) drop(a, 0) = drop(a, 0) + drop(a, 2) ' jos uusi sijainti ei ole tyhjä paikka, palautetaan x edelliseksi, vaihdetaan virtaussuunta vastakkaiseksi IF POINT(drop(a, 0), drop(a, 1)) <> 0 THEN drop(a, 0) = x drop(a, 2) = -drop(a, 2) END IF ELSE 'jos pisaran virtaussuunta ei ole määritelty, arvotaan suunta (1 tai -1) drop(a, 2) = -1 + CINT(RND * 1) * 2 END IF END IF 'piirretään pisara PSET (drop(a, 0), drop(a, 1)), 9 NEXT a LOOP UNTIL INKEY$ <> ""
DEFINT A-Z aiheuttaa sen, että muuttujien tyyppi on oletuksena INTEGER. Sen vuoksi muuttujien käsittely on nopeampaa ja ohjelmakin nopeutuu.
Jotain sen tapaista arvelinkin, kun huomasin, että on sellaisiakin kuin DEFSTR (string) tai vaikka DEFDBL (double). Mutta mikä tuo A-Z on?
DEFINT-komennon parametri määrittää, millä kirjaimella alkavat muuttujat ovat automaattisesti INTEGER-tyyppisiä - tässä tapauksessa siis kaikki muuttujat. Tuossa ohjelmassa oikeastaan riittäisi DEFINT A-B, D (muuttujat ovat a, b, drop ja drops).
tällainen on hyvä hidastustapa: (hth opetti)
alkuaika = TIMER DO: LOOP UNTIL TIMER - alkuaika >= 0.33 'tähän kuinka monta sekuntia hidastetaan
tuon pistät loopin loppuun niin hvyin toimii =)
eipäs q do while inp(&H3da) and 8 : loop
do until inp(&H3da) and 8: loop
Tulee aika siisti ku muuttaa esteiden piirtämisen silleen et tekee 30 viivaa random paikkoihin, hienosti menee toi vesi xD
En saa toimimaan QuickBasicilla :|
Porttaan BlitzBasicille :)
.. BlitzBasic on liian hidas :|
Porttaan C:lle. Prkl.
Jos on liian hidas niin pienennä pisaroiden määrää. Katso myös vesipisarat 2 paineversio. Miksei QuickBasicilla toimi? Mulla ainakin toimii alkuperäinen ja 4.5.
Makia toi on. Mikä muuten toi 0x3DA mahtaa olla?
Aihe on jo aika vanha, joten et voi enää vastata siihen.