Ohjelma näyttää ruudulla planeetan, joka pyörii akselinsa ympäri. Planeetan ominaisuuksia (koko, pyörimisnopeus, tekstuurin tarkkuus, kallistuskulma...) voi itse kokeilla viritellä mielensä mukaan.
'Planeetta-animaatio ' Perustuu eräänlaisen kartan valmiiksi laskemiseen. Planeettaa piirrettäessä ' katsotaan kartasta, mikä kohta pintakuvioinnista piirretään. ' ' Versio: 2.1 y | ' Tekijä: Teppo Niinimäki | ' Päiväys: 30.7.2003 |________ x ' / ' / z '--------------------------------------------------------------------------- planeetta% = 1 '1 = kuu tms. '2 = neptunus tms. sade% = 64 'planeetan säde (leveyssuunnassa) tahdet% = 1 'piirretäänkö tähdet? (0/1) valaistus% = 1 'onko valaistus päällä? (0/1) taustavalo% = 1 'onko taustavalo? (0/1) (0 on aidomman näköinen) reunapehmennys% = 1 'suoritetaanko planeetan reunojen pehmennys? (0/1) keskusX% = 160 'planeetan keskikohta ruudulla keskusY% = 100 kuvanLeveys% = 256 'pintakuvioinnin koko kuvanKorkeus% = 128 puorimisnopeus! = 16 'nopeus, jolla planeetta pyörii akselinsa ympäri tahtia% = 200 'tähtien määrä valoX! = -2 'valon suunta vektorina valoY! = -1 '(kokeile valoZ!=-1 kun planeetta%=1 ja taustavalo%=0 valoZ! = 1 ' -> kuun sirppi) valo% = 100 'valon voimakkuus tvalo% = 40 'taustavalon voimakkuus suhde! = 200 / 240 'pikselit SCREEN 13 :ssa korkeampia kuin leveitä ' -> korjataan vääristymä 'muuttamalla saa planeetasta hassun muotoisen IF planeetta% = 1 THEN kallistus1! = 0 'planeetan kallistuminen vasemmalle kallistus2! = 0 'planeetan kallistuminen ruutua kohti ELSEIF planeetta% = 2 THEN kallistus1! = 10 kallistus2! = 40 END IF pehmennyksia% = 5 'paljonko pintatekstuuria pehmennetään '----- Alkuarvojen asetus päättyy ja koodi alkaa ---- SCREEN 13 leveys% = sade% * 2 korkeus% = sade% * 2 * suhde! puolileveys% = leveys% \ 2 puolikorkeus% = korkeus% \ 2 CONST PI = 3.14159 RANDOMIZE TIMER DIM imgx(leveys% - 1, korkeus% - 1) AS INTEGER DIM imgy(leveys% - 1, korkeus% - 1) AS INTEGER DIM valoisuus(leveys% - 1, korkeus% - 1) AS INTEGER DIM vari(kuvanLeveys% - 1, kuvanKorkeus% - 1) AS INTEGER ' Vaihdetaan paletti FOR i% = 0 TO 63 PALETTE i%, i% + i% * 256 + i% * 256 ^ 2 PALETTE i% + 64, i% \ 4 + i% * 256 + i% * 256 ^ 2 NEXT i% COLOR 60 '----- Esilaskenta alkaa ----- ' Piirretään karkea pintakuviointi PRINT "Pintakuviointi."; FOR y% = 0 TO kuvanKorkeus% - 1 IF planeetta% = 1 THEN 'w% = 4 * SQR((kuvanKorkeus% / 2) ^ 2 - (y% - kuvanKorkeus% / 2 + .5) ^ 2) w% = kuvanLeveys% * SIN((y% + .5) * PI / kuvanKorkeus%) ELSEIF planeetta% = 2 THEN w% = kuvanLeveys% / (RND * 20 + 10) END IF FOR x% = 0 TO w% - 1 IF planeetta% = 1 THEN v% = INT(RND * 20 + 20) ELSEIF planeetta% = 2 THEN v% = INT(RND * 10 + 30) + 64 END IF ax& = x% akL& = kuvanLeveys% FOR xx& = ax& * akL& \ w% TO (ax& + 1) * akL& \ w% - 1 vari(xx&, y%) = v% 'PSET (xx&, y%), vari(xx&, y%) NEXT xx& NEXT x% IF y% MOD 20 = 0 THEN PRINT "."; NEXT y% PRINT "OK" ' Pehmennetään pintakuviointi PRINT "Pehmennys."; FOR i% = 1 TO pehmennyksia% FOR x% = 0 TO kuvanLeveys% - 1 FOR y% = 0 TO kuvanKorkeus% - 1 v1% = vari(x%, y%) v2% = vari((x% + 1) MOD kuvanLeveys%, y%) v3% = vari((x% - 1 + kuvanLeveys%) MOD kuvanLeveys%, y%) v4% = vari(x%, (y% + 1) MOD kuvanKorkeus%) v5% = vari(x%, (y% - 1 + kuvanKorkeus%) MOD kuvanKorkeus%) vari(x%, y%) = CINT((v1% + v2% + v3% + v4% + v5%) / 5) 'PSET (x%, y%), vari(x%, y%) NEXT y% IF x% MOD (20 * pehmennyksia%) = 0 THEN PRINT "."; NEXT x% NEXT i% PRINT "OK" 'CLS PRINT "Pintakartta."; ' Lasketaan kartta ja valaistus FOR x% = 0 TO leveys% - 1 FOR y% = 0 TO korkeus% - 1 xx! = x% - sade% + .5 yy! = y% / suhde! - sade% + .5 dxy! = SQR(xx! ^ 2 + yy! ^ 2) IF dxy! > sade% THEN ' Pikseli planeetan ulkopuolella imgx(x%, y%) = -1 imgy(x%, y%) = -1 ELSE ' Pikseli planeetan sisäpuolella zz! = SQR(sade% ^ 2 - dxy! ^ 2) ' Kallistetaan sivusuunnassa IF xx! <> 0 THEN k1! = ATN(yy! / xx!) ELSE k1! = 0 END IF IF xx! < 0 OR (k1! = 0 AND xx! > 0) THEN k1! = k1! + PI k1! = k1! + kallistus1! * PI / 180 xxx! = dxy! * COS(k1! + PI * 2) yyy! = dxy! * SIN(k1! + PI * 2) zzz! = zz! ' Kallistetaan syvyyssuunnassa dyz! = SQR(yyy! ^ 2 + zzz! ^ 2) IF zzz! <> 0 THEN k2! = ATN(yyy! / zzz!) ELSE k2! = 0 END IF IF zzz! < 0 OR (k2! = 0 AND zzz! > 0) THEN k2! = k2! + PI k2! = k2! - kallistus2! * PI / 180 yyy! = dyz! * SIN(k2! + PI * 2) zzz! = dyz! * COS(k2! + PI * 2) ' Lasketaan, millä "leveyspiirillä" pikseli sijaitsee IF zzz! <> 0 AND xxx! <> 0 THEN kulma1! = ATN(yyy! / SQR(zzz! ^ 2 + xxx! ^ 2)) ELSE kulma1! = 0 END IF IF zzz! < 0 OR (kulma1! = 0 AND yyy! > 0) THEN kulma1! = kulma1 + PI ' Lasketaan, millä "pituuspiirillä" pikseli sijaitsee IF zzz! <> 0 THEN kulma2! = ATN(xxx! / zzz!) ELSE kulma2! = 0 END IF IF zzz! < 0 OR (kulma2! = 0 AND xxx! > 0) THEN kulma2! = kulma2 + PI imgy(x%, y%) = INT((kulma1! + PI / 2) * kuvanKorkeus% / PI) imgx(x%, y%) = INT((kulma2! + PI / 2) * kuvanLeveys% * 8 / PI) ' Valaistus IF valaistus% = 1 THEN ' Lasketaan valon määrä pistetulolla: valo1% = (xx! * valoX! + yy! * valoY! + zz! * valoZ!) * valo% / SQR(valoX! ^ 2 + valoY! ^ 2 + valoZ! ^ 2) / sade% IF valo1% < 0 THEN valo1% = 0 ' "Taustavalo" myös pistetulolla (valo tulee kameran/ruudun suunnasta): IF taustavalo% = 1 THEN valo2% = zz! * tvalo% / sade% IF valo2% < 0 THEN valo2% = 0 ELSE valo2% = 0 END IF valoisuus(x%, y%) = valo1% + valo2% ELSE valoisuus(x%, y%) = 100 END IF ' Pehmennetään planeetan reunoja IF reunapehmennys% = 1 THEN IF zz! * 5 < sade% THEN valoisuus(x%, y%) = valoisuus(x%, y%) * zz! * 5 / sade% END IF END IF NEXT y% IF x% MOD 10 = 0 THEN PRINT "."; NEXT x% PRINT "OK" 'DO: LOOP UNTIL INKEY$ <> "" CLS ' Piirretään tähdet IF tahdet% = 1 THEN FOR i% = 1 TO tahtia% PSET (INT(RND * 320), INT(RND * 200)), INT(RND * RND * 50) NEXT i% END IF '----- Esilaskenta päättyy ja pääsilmukka alkaa ----- ' Piirtosilmukka i! = 0 t# = TIMER DO ' Hidastus t# = t# + 0.05 WHILE TIMER < t#: WAIT &h3da, &h8: WEND ' Pyöritetään i! = i! + puorimisnopeus! IF CINT(i!) >= kuvanLeveys% * 16 THEN i! = i! MOD kuvanLeveys% i% = CINT(i!) ' Piirretään FOR x% = 0 TO leveys% - 1 FOR y% = 0 TO korkeus% - 1 IF imgx(x%, y%) <> -1 THEN v% = vari((imgx(x%, y%) + i%) \ 16 MOD kuvanLeveys%, (imgy(x%, y%)) MOD kuvanKorkeus%) va% = (v% MOD 64) * valoisuus(x%, y%) \ 100 IF va% > 63 THEN va% = 63 PSET (x% + 160 - puolileveys%, y% + 100 - puolikorkeus%), (v% \ 64) * 64 + va% END IF NEXT y% NEXT x% LOOP UNTIL INKEY$ = CHR$(27) END
Todella hieno! Kommentteja voisi tosin olla koodin loppupuolella enemmän.
Todella hieno.
Ja paljon nopeampi, mitä QBasicista voisi luulla.
Aika pirun hieno muuten on. :o
Mahtava vinkki.
Juu helmi!
Vau !! Ihan kuin joku aito ! En tiennytkään että qbasicillä saa noin hienoa grafikaa ! Cool. Mahta vinkki niinkuin odys jo sanoi
hieno on.
Ei uskois että on qbasicillä tehty...
Tää on aivan uskomaton
Ei tämmöstä voi edes yrittää tehdä! ghuy'cha' tää on hieno!
Woah.
Oletko suunnitellut tuon itse kokonaan alusta loppuun? Ja kuinka kauan meni tehdessä?
Kyllä se on itse suunniteltu ja tehty. En kai minä nyt tänne muiden tekeleitä omalla nimelläni laittaisi! ;)
Ekan version tein jotakuinkin vuosi sitten, enkä tosiaankaan muista kaunko siihen kului aikaa. Satuin kaivamaan sen sitten uudestaan esille, kirjoitin koodin lähes kokonaan uudestaan ja laitoin seuraavana päivänä tänne. (Se eka versio oli kyllä paljon rumempi sekä hitaampi, siinä ei ollut kallistusta ja varjostuskin oli päin honkia.)
Toi on kyllä uskomattoman hieno ja tehty QBasicilla!!!!
En ikuna onnistuis tuohon. Saanko käyttää tota jos
joskus teen avaruuspelin?
Tuohan on tosi hieno ja vieläpä Quick BASICilla!
erittäin loistava koodi! mitään valittamista ei löydy! :)
Ei jumantsukka! Toi on siisti. Kyllä qb:llä saa ihmeitä aikaan!
Zuizh! COOOOOOOOOOOOOOOOOOL!!!!!!!! Vaan sikahidas DosBoxil. Mut sikahienot kraffat.
Ex toi ny varmana oo mikää semmone joka ottaa yhteyt nettii ja johonki C++ohielmaa? :DDDDDDXXXXXXXXXXZZZZZ
Aihe on jo aika vanha, joten et voi enää vastata siihen.