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)
ENDTodella 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.