Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Hajottamisefekti

Juhko [29.04.2007 17:29:46]

#

HUOM! Päivityksiä saattaa olla tulossa!

Tämä ohjelma hajottaa näytölle piirretyn kuvan. Kaikki on ohjattavissa, voit päättää sotkettavan alueen, miten paljon sotketaan ja vähän muutakin. Efektiä voi käyttää mm. esineiden hajottamiseen tietokonepeleissä, kuvan epäselventämiseen, fontin muokkaamiseen tekstissä, jne.

Miinuspuolena mainittakoon, ohjelma toimii melko hitaasti, sitä ei siis kannata sijoittaa mihinkään nopeaan looppiin, paitsi jos käytössäsi on melko nopea prosessori.

Käyttöohjeet
Toimintaperiaate on se, että ohjelma käy jokaisen pikselin valitulta alueelta läpi ja kopioi haluttuun kohtaan.

xadd ja yadd
Muuttujat xadd ja yadd määrittävät, mihin kohtaan piste kopioidaan. Uuden pisteen koordinaatti saadaan kaavoista:
uusix = vanhax + xadd ja uusiy = vanhay + yadd
HUOM! Jos super = 0, siirto ei ehkä tapahdu oikeaan suuntaan.

xstep ja ystep
Jokaisen pisteen läpikäyminen toimii tällä tavalla:

FOR xdo = xstart TO xstop STEP xstep
  FOR ydo = ystart TO ystop STEP ystep
    'nyt käsiteltävä piste löytyy kohdasta xdo,ydo
  NEXT ydo
NEXT xdo

xstep ja ystep siis määräävät, miten monen pisteen yli kullakin akselilla hypätään.

xstart, ystart, xstop ja ystop
Nämä muuttujat määräävät sotkettavan alueen. Sotkettava alue on suorakulmio koordinaateissa (xstart,ystart)-(xstop,ystop)

always, super, movenc ja movebg
Nämä ovat muuttujat, joilla määritetään sotkemisen kylläisyys, teho ja sotkemistapa. Jos always = 1, jokainen läpikäyty piste siirretään, muuten siirrettävät pisteet arvotaan. superia taas voidaan käyttää "tehosekoittamiseen", jolloin saman pisteen siirtoa kahta kertaa ei estetä (super = 1). Jos super = 0, tämä estäminen tapahtuu. Seuraava muuttuja, movenc, määrittää, kopioidaanko vai siirretäänkö piste. Jos movenc = 1, piste siirretään, ja vanhaan kohtaan piirretään piste halutulla värillä. Periaatteena on, että uusi piste on pohjan väri, jolloin katsoja saa vaikutelman, että piste todella on siirretty, eikä kopioitu. Pohjan väri määritetään muuttujassa bgcolor. Viimeinen muuttuja, movebg määrää, siirretäänkö pohjan väriset pisteet. Jos movebg = 1, pisteet siirretään, jos 0, ei siirretä.

ps. SAAT KÄYTTÄÄ JA MUOKATA EFEKTIÄ VAPAASTI, EIKÄ TEKIJÄÄ TARVITSE MAINITA. ET KUITENKAAN SAA VÄITTÄÄ MISSÄÄN, ETTÄ ITSE EFEKTI OLISI SINUN TEKEMÄSI. SAAT KUITENKIN PITÄÄ KAIKKI OIKEUDET ITSELLÄSI OHJELMAKOKONAISUUDESSA, JOSSA KÄYTÄT TÄTÄ EFEKTIÄ.

SCREEN 13 'näyttötila
RANDOMIZE TIMER 'satunnaislukuja

'sotkemisen asetukset
xadd = 1 'kuinka paljon pisteitä siirretään
yadd = 1
xstep = 1 'kuinka monen pisteen yli hypätään
ystep = 1
xstart = 1 'sotkettava alue, ei kovin tarkka
ystart = 1
xstop = 320
ystop = 200
always = 0 'siirretäänkö jokaista läpikäytyä pistettä
super = 0 'supersotkeminen, ei estetä saman pisteen siirtoa kahta kertaa
movenc = 1 'kopioidaanko vai siirretäänkö piste
bgcolor = 1 'pohjan väri
movebg = 0 'siirretäänkö pohjan väriset pisteet

'nyt piirrellään jotain...
LINE (0, 0)-(320, 200), bgcolor, BF
PRINT "Ohjelmointiputka"
LINE (INT(RND * 320), INT(RND * 200))-(INT(RND * 320), INT(RND * 200)), INT(RND*200), INT(RND * 12) + 2
LINE (INT(RND * 320), INT(RND * 200))-(INT(RND * 320), INT(RND * 200)), INT(RND*200), INT(RND * 12) + 2, B
LINE (INT(RND * 320), INT(RND * 200))-(INT(RND * 320), INT(RND * 200)), INT(RND*200), INT(RND * 12) + 2, BF
CIRCLE (INT(RND * 320), INT(RND * 200)), INT(RND * 100) + 2, INT(RND * 12) + 2
CIRCLE (INT(RND * 320), INT(RND * 200)), INT(RND * 100) + 2, INT(RND * 12) + 2
CIRCLE (INT(RND * 320), INT(RND * 200)), INT(RND * 100) + 2, INT(RND * 12) + 2

'tästä alkaa kaikki sotkemiseen liittyvät jutskat
IF xstart > xstop AND xstep > 0 THEN xstep = 0 - xstep 'ettei for ala sekoilla
IF xstart < xstop AND xstep < 0 THEN xstep = 0 - xstep
IF ystart > ystop AND ystep > 0 THEN ystep = 0 - ystep
IF ystart < ystop AND ystep < 0 THEN ystep = 0 - ystep
IF super = 0 THEN 'jos super = 0
  'estetäään saman pisteen siirto kahta kertaa siirtämällä pisteitä
  'eri suuntaan kuin mutä kuvaa käydään läpi
  IF xadd > 0 AND xstep > 0 THEN SWAP xstart, xstop: xstep = 0 - xstep
  IF yadd > 0 AND xstep > 0 THEN SWAP ystart, ystop: ystep = 0 - ystep
  IF xadd < 0 AND xstep < 0 THEN SWAP xstart, xstop: xstep = 0 - xstep
  IF yadd < 0 AND xstep < 0 THEN SWAP ystart, ystop: ystep = 0 - ystep
END IF
FOR xdo = xstart TO xstop STEP xstep 'käydään valitulta alueelta kaikki halutut pisteet läpi
  FOR ydo = ystart TO ystop STEP ystep
    di = CINT(RND) 'di:n arvoksi joko 0 tai 1
    IF always = 1 THEN di = 1 'jos always =1, di joka tapauksessa 1:ksi
    IF di = 1 THEN 'jos di = 1
      movepoint = 1
      IF movebg = 0 THEN
        IF POINT(xdo, ydo) = bgcolor THEN movepoint = 0
      END IF
      IF movepoint = 1 THEN
        clr = POINT(xdo, ydo) 'clr:n arvoksi väri kohdasta xdo,ydo
        PSET (xdo + xadd, ydo + yadd), clr
        IF movenc = 1 THEN PSET (xdom ydo), bgcolor 'jos movenc = 1, piirretään pohjan värinen piste vanhan pisteen tilalle
      END IF
    END IF
  NEXT ydo
NEXT xdo
'tähän loppuu kaikki sotkemiseen liittyvät jutskat

moptim [18.06.2007 12:00:23]

#

Kuinka nopia prossun pitäisi olla? Osaatko arvioida?
EDIT: Siis siihen, että viitsisi laittaa looppiin.

Juhko [18.06.2007 13:16:27]

#

Koko näytön sotkemiseen loopissa saisi olla n. 2GHz -prossu, mutta pienempään alueeseen riittäisi kai pienempikin. Itse testasin tätä < 166 MHz -prossulla, joten not sure... Pokettamalla varmaan saisi nopeutusta, mutta jostakin vanhasta keskustelusta saamani pokepsettausohje bugasi. :(

EDIT: Jos laitat xstepin ja ystepin suuriksi, ohjelma nopeutuu huomattavasti, mutta sekoitus ei ole kovin tiheää.

Vastaus

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

Tietoa sivustosta