Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Vesipisarat 2 paine-versio

Sivun loppuun

hunajavohveli [10.09.2003 17:57:05]

#

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$ <> ""

Antti Laaksonen [11.09.2003 21:19:57]

#

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

Gwaur [11.09.2003 22:18:56]

#

ja sitten seuraavan elementin vuoro: tuli

Sami [12.09.2003 15:43:17]

#

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

Sami [12.09.2003 15:51:53]

#

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.

hunajavohveli [12.09.2003 16:41:48]

#

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.

hunajavohveli [12.09.2003 16:43:12]

#

Lisään myös tuon palettijutun. Olisin tehnyt sen itse, jos tajuaisin paletin muuttamisesta edes jotain.

hunajavohveli [12.09.2003 16:53:08]

#

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.

Sami [12.09.2003 16:53:29]

#

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/23854-qb-paletin-käyttöä

Sami [12.09.2003 16:55:18]

#

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)

thefox [13.09.2003 12:00:25]

#

Kelpo vinkki, omaperäinen. Opettele tosin käyttämään sisennyksiä ;-)

hunajavohveli [13.09.2003 12:39:15]

#

Hups! Joo, sisennykset jäikin tosiaan pois. Pitääpä muistaa lisäillä seuraaviin vinkkeihin.

acorn [13.09.2003 16:30:50]

#

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.cpp

hunajavohveli [23.09.2003 20:54:45]

#

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?

Fisher [10.06.2004 20:48:13]

#

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!

Codeprofile [10.11.2006 20:24:44]

#

Yritin kääntää tuon exeksi, mutta ei toiminut exenä.

Dude [15.08.2007 23:17:07]

#

qbeellä saa eri värejä mummielestö 250047. Hieno on.

hunajavohveli [25.09.2007 17:24:05]

#

Kullakin värikomponentilla on 64 mahdollista arvoa, joten kaiken kaikkiaan erilaisia värejä saa 64³ eli 262144.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta