Kirjautuminen

Haku

Tehtävät

Koodit: QB: Veden virtaus -efekti

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)

Kommentit

snakari [10.03.2002 18:16:19]

#

Kerrankin hieno koodi!

vipemype [10.03.2002 22:07:04]

#

Ihan siisti.

HaRa [12.05.2002 21:24:36]

#

hidas

Jogge [13.08.2002 19:45:29]

#

Ohjelma nopeutuu kun lisää alkuun rivin:
DEFINT A-Z

Yo-guy [14.08.2002 19:34:06]

#

Asiaa!

Lord Juha [11.10.2002 19:41:14]

#

Tuossa jää kyllä imatrankoski toiseksi!

Sami [19.04.2003 11:09:12]

#

Ihme idea, mutta silti hyvin toimiva ja hieno.

Puhveli [13.03.2004 17:34:18]

#

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

Dude [31.08.2007 18:22:48]

#

Nopeutuu yli puolet DEFINT A-Ztalla. Max voi pistää 9999.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta