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.