Kirjoittaja: Antti Laaksonen
Kirjoitettu: 09.03.2002 – 09.03.2002
Tagit: grafiikka, koodi näytille, vinkki
Yksi henkilökohtaisista suosikkiefekteistä on veden virtaaminen. Päätin tehdä sellaisen itsekin, ja tässä se nyt on. Vesi virtaa maastossa ja putoaa lopuksi isoon altaaseen.
SCREEN 13
TYPE kohta
  x AS INTEGER
  y AS INTEGER
  s AS INTEGER
END TYPE
'pisaroita yhteensä
max = 5000
'pisarataulukko
DIM vesi(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 - .6 'mitä pienempi, sen vuolaampi
  vesi(i).y = vkohta
NEXT
'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
LOOP WHILE INKEY$ <> CHR$(27)Kerrankin hieno koodi!
Ihan siisti.
hidas
Ohjelma nopeutuu kun lisää alkuun rivin:
DEFINT A-Z
Asiaa!
Tuossa jää kyllä imatrankoski toiseksi!
Ihme idea, mutta silti hyvin toimiva ja hieno.
Et ole antti ainut joka on yrittänyt tollasta tehdä. Täytyy myöntää että toi koodi on toimiva ja nopee varsinkin verrattuna omaani. Laita vielä jokainen piste hiukan eri sävyseksi niin alkaa päitä putoilla. Tota vois tuijottaa tosi kauan ja ihmetellä et missä vaiheessa se alin kuppi täyttyy :D
Nopeutuu yli puolet DEFINT A-Ztalla. Max voi pistää 9999.