Tässä olisi uusi versio Vesipisaroista (katso Vesipisarat muodostavat järviä.) Tässä versiossa vesimassat muodostavat paineen sen mukaan, kuinka paljon pisaroita on päällekkäin. Paineen määrää visualisoidaan väreillä. Pinnan väri on sinistä, sillä siinä ei ole painetta, mutta syvemmällä väri muuttuu punaisesta, keltaiseksi, vihreäksi jne. Jos painetta tulee liikaa, rasitus voi murtaa esteitä ja vesi pääsee valumaan niiden läpi. Toiminta perustuu siihen, että jokaisen pisaran paine on yhtä suurempi kuin sen yläpuolella olevan pisaran paine. Jos pisaran yläpuolella ei ole toista pisaraa, se on pinnassa ja sen paine on silloin 0.
Edit 2019 by mod: Hidastukseen vaihdettu TIMER. Toimii FreeBASICilla asetuksella -lang qb.
SCREEN 13 'nopeutetaan määrittelemällä muuttujat INTEGER-tarkkuudelle. DEFINT A-Z RANDOMIZE TIMER 'pisaroiden määrä ja tiedot drops = 7999 DIM drop(7999, 3) 'piirretään esteitä LINE (0, 10)-(140, 40) LINE (319, 10)-(180, 40) LINE (120, 70)-(160, 60) LINE (160, 60)-(200, 70) LINE (40, 60)-(145, 90) LINE (280, 60)-(175, 90) LINE (145, 150)-(145, 90) LINE (175, 150)-(175, 90) LINE (145, 150)-(175, 150) 'arvotaan pisarat FOR a = 0 TO drops DO drop(a, 0) = INT(RND * 320) drop(a, 1) = INT(RND * 10) LOOP UNTIL POINT(drop(a, 0), drop(a, 1)) = 0 ' kunnes löytyy tyhjä paikka NEXT a t# = TIMER DO t# = t# + 0.01 WHILE TIMER < t#: WAIT &h3da, &h8: WEND FOR a = 0 TO drops alapiste = POINT(drop(a, 0), drop(a, 1) + 1) ylapiste = POINT(drop(a, 0), drop(a, 1) - 1) 'jos alapiste ei ole tyhjää ja ylapiste on vettä, pisteen väri (paine) on ylapisteen paine, johon lisätään 1. IF alapiste <> 0 AND ylapiste > 31 THEN drop(a, 3) = ylapiste + 1 ELSE drop(a, 3) = 32 END IF 'kumita pisara edellisestä paikasta PSET (drop(a, 0), drop(a, 1)), 0 'jos alapuolella tyhjää, tai alapuolella on este JA paine > paineraja '(paineraja on tässä 80, sitä voi muuttaa, kunhan se on väliltä 32-255) IF alapiste = 0 OR (drop(a, 3) > 80 AND alapiste = 15) THEN drop(a, 1) = drop(a, 1) + 1 'liikuta pisaraa alaspäin ELSE 'jos pisaran virtaussuunta on määritelty (ei ole 0, vaan 1 tai -1) IF drop(a, 2) <> 0 THEN 'liikutetaan pisaraa virtaussuuntaan uusix = drop(a, 0) + drop(a, 2) IF POINT(uusix, drop(a, 1)) = 0 THEN drop(a, 0) = uusix ELSE ' jos uusi sijainti ei ole tyhjä, vaihdetaan virtaussuunta vastakkaiseksi 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)), drop(a, 3) NEXT a LOOP UNTIL INKEY$ <> ""
Tämähän on muuten hieno, erityisesti tuo esteenmurtumisefekti! Tässä pari kehitysideaa:
- kokeile määrittää paletti niin, että siinä on vain vedelle luonnollisia värejä
- yritä saada usein vedestä nousevat "piikit" pois
ja sitten seuraavan elementin vuoro: tuli
Lisäämällä tämän koodinpätkän rivin jälkeen, jolla lukee SCREEN 13, saa veden näyttämään oikeammalta. Pinnalla vesi on vaaleampaa ja pohjalla tummempaa.
FOR i = 32 TO 95 OUT &H3C8, i OUT &H3C9, 0 OUT &H3C9, 0 OUT &H3C9, 95 - i NEXT i
Itse ohjelma on hieno ja piikkien poistamiseenkin löytyy ratkaisu...
Lisäämällä rivien
PSET (drop(a, 0), drop(a, 1)), drop(a, 3) 'piirretään pisara NEXT a
Väliin rivin
a = a + INT(RND * 2)
Eli siis hyppimällä joidenkin pisaroiden yli (eli jätetään osa pisaroista liikuttamatta), jolloin alla olevat pisarat eivät kuljeta päällään olevia pisaroita.
Ajattelinkin ilmoittaa, että joku joka osaa käyttää palettia, voisikin tehdä vedestä aidon näköistä. Itse en osaa käyttää sitä, mutta voisin yrittää opetella. Mistähän noista OUT-käskyistä vois oppia lisää? Niiden piikkien poistamista kokeilin itsekin. Se onnistui, mutta aiheutti pieniä ongelmia, joten jätin sen pois ja unohdin pian koko piikkiasian, joten en sen takia kokeillut muita keinoja. Lisäämpä tuon komennon mukaan. Sen ei luulisi aiheuttavan samaa ongelmaa kuin aikaisempi piikkien poistoyritys.
Lisään myös tuon palettijutun. Olisin tehnyt sen itse, jos tajuaisin paletin muuttamisesta edes jotain.
Uskomatonta! Veden värin vaihtumista tuskin huomaa, ellei paineen vaihtelu ole suuri. Ja siitä huolimatta ohjelma kuintekin erottaa jokaisen värin toisesta. Myös tuo toinen vinkki on hyvä. Ei enää ongelmaa niistä piikeistäkään. Hmm... vai seuraava elementti tuli... voisipa kokeilla. Ja tästäkin ohjelmasta voi tulaa vielä uusia versioita.
PALETTE-käsky on helpompi käyttää kuin OUT, mutta n. 50-100 kertaa hitaampi, tosin yleensä eroa ei huomaa kun kummallakin tavalla 64 värin muuttamiseen menee vain muutama millisekunti.
Tein tänne joskus koodivinkin paletin käytöstä ja osoite on https://www.ohjelmointiputka.net/koodivinkit/
Miksi ne pitää olla eri värisiä? kaikkihan voi pistää saman värisiksi, jos niin haluaa. Ja totta kai ohjelma huomaa eron niiden välillä, kun ne ovat eri värejä (toisen indeksi on esim. 32 ja toisella 33, niissähän on selvä ero)
Kelpo vinkki, omaperäinen. Opettele tosin käyttämään sisennyksiä ;-)
Hups! Joo, sisennykset jäikin tosiaan pois. Pitääpä muistaa lisäillä seuraaviin vinkkeihin.
On kyllä hienon näköinen. Väänsin itsekin C++:lla saman käyttäen Allegroa:
http://personal.inet.fi/koti/acorn/Vesipisarat v2.zip
http://personal.inet.fi/koti/acorn/vesipisarat.
Joo, Sami, käsitin kyllä nyt. Olin tajunnut paletin toiminnan vähän eri tavalla. Mietin vain tuossa, että onko tuosta sinisestä tosiaan noin monta eri sävyä? Eihän ne kaikki edes esiinny normaalissa muuttamattomassa väriasteikossa. Mitenkä sitten sanotaan, että DOS näyttää 256 väriä, vaikka niitä on noin monta lisää. Vai tarkoittaako se sitä, että värejä näkyy aina 256 erilaista väriä kerralla, niin että ne voivat olla mitä vain, kunhan samaan aikaan ei ole yli 256 erilaista?
Heh, koitin tätä väreiksi...
FOR i = 32 TO 95 OUT &H3C8, i OUT &H3C9, 95 - i OUT &H3C9, 0 OUT &H3C9, 0 NEXT i
Apua!
Yritin kääntää tuon exeksi, mutta ei toiminut exenä.
qbeellä saa eri värejä mummielestö 250047. Hieno on.
Kullakin värikomponentilla on 64 mahdollista arvoa, joten kaiken kaikkiaan erilaisia värejä saa 64³ eli 262144.
Aihe on jo aika vanha, joten et voi enää vastata siihen.