Kirjoittaja: Juhko
Kirjoitettu: 12.10.2006 – 12.10.2006
Tagit: grafiikka, koodi näytille, vinkki
Tämä on tällainen 3D-avaruus. Tähtien liikettä ohjataan nuolinäppäimillä. Saa käyttää aivan vapaasti eikä tekijän nimeä tarvitse mainita. Ilmoittakaa virheistä! :)
Nuo RStarX ja RStarY ovat tähtien edelliset koordinaatit ja StarS = tähden kerros.
EDIT: Lisäsin vielä tuommoisen paremman SCREEN 7, , 0, 1 -version, joka ei kumita tähtiä vaan piirtää ne uudestaan joka kerta. En testannut tuota, jos ei toimi niin kertokaa ihmeessä!
'*** Tähtianimaatio
DIM StarX(200) AS INTEGER
DIM StarY(200) AS INTEGER
DIM StarS(200) AS INTEGER
DIM RStarX(200) AS INTEGER
DIM RStarY(200) AS INTEGER
SCREEN 13
DO: INPUT "Kuinka monta tähteä (1-200)? ", Tahtia: LOOP UNTIL Tahtia <= 200 AND Tahtia >= 1
DO: INPUT "Kuinka monta kerrosta (2-20)? ", Kerroksia: LOOP UNTIL Kerroksia <= 20 AND Kerroksia >= 2
CLS
FOR Arvo = 1 TO 200
StarX(Arvo) = INT(RND * 320)
StarY(Arvo) = INT(RND * 200)
StarS(Arvo) = INT(RND * Kerroksia) + 2
NEXT Arvo
Suunta = 1
DO
Suunta$ = INKEY$
IF Suunta$ = CHR$(0) + "H" THEN Suunta = 1
IF Suunta$ = CHR$(0) + "P" THEN Suunta = 2
IF Suunta$ = CHR$(0) + "K" THEN Suunta = 3
IF Suunta$ = CHR$(0) + "M" THEN Suunta = 4
FOR Suorita = 1 TO Tahtia
RStarX(Suorita) = StarX(Suorita)
RStarY(Suorita) = StarY(Suorita)
IF StarX(Suorita) < 0 THEN StarX(Suorita) = 320
IF StarX(Suorita) > 320 THEN StarX(Suorita) = 0
IF StarY(Suorita) < 0 THEN StarX(Suorita) = 200
IF StarY(Suorita) > 200 THEN StarX(Suorita) = 0
IF Suunta = 1 THEN StarY(Suorita) = StarY(Suorita) - StarS(Suorita)
IF Suunta = 2 THEN StarY(Suorita) = StarY(Suorita) + StarS(Suorita)
IF Suunta = 3 THEN StarX(Suorita) = StarX(Suorita) - StarS(Suorita)
IF Suunta = 4 THEN StarX(Suorita) = StarX(Suorita) + StarS(Suorita)
PSET (StarX(Suorita), StarY(Suorita)), 15
PSET (RStarX(Suorita), RStarY(Suorita)), 0
NEXT Suorita
WAIT &H3DA,8
LOOP'*** Omaan avaruuspeliin
DIM StarX(200) AS INTEGER
DIM StarY(200) AS INTEGER
DIM StarS(200) AS INTEGER
DIM RStarX(200) AS INTEGER
DIM RStarY(200) AS INTEGER
SCREEN 13
Tahtia = 60
Kerroksia = 5
CLS
FOR Arvo = 1 TO 200
StarX(Arvo) = INT(RND * 320)
StarY(Arvo) = INT(RND * 200)
StarS(Arvo) = INT(RND * Kerroksia) + 2
NEXT Arvo
Kulma = 0
DO
Suunta$ = INKEY$
IF Suunta$ = CHR$(0) + "K" THEN Kulma = Kulma + 10
IF Suunta$ = CHR$(0) + "M" THEN Kulma = Kulma - 10
IF Kulma > 360 THEN Kulma = 1
IF Kulma < 1 then Kulma = 360
FOR Suorita = 1 TO Tahtia
RStarX(Suorita) = StarX(Suorita)
RStarY(Suorita) = StarY(Suorita)
IF StarX(Suorita) < 0 THEN StarX(Suorita) = 320
IF StarX(Suorita) > 320 THEN StarX(Suorita) = 0
IF StarY(Suorita) < 0 THEN StarX(Suorita) = 200
IF StarY(Suorita) > 200 THEN StarX(Suorita) = 0
StarX(Suorita) = StarX(Suorita) - SIN(Kulma * 2 * 3.141593 / 360) * StarS(Suorita)
StarY(Suorita) = StarY(Suorita) - COS(Kulma * 2 * 3.141593 / 360) * StarS(Suorita)
PSET (StarX(Suorita), StarY(Suorita)), 15
PSET (RStarX(Suorita), RStarY(Suorita)), 0
NEXT Suorita
WAIT &H3DA,8
LOOP'*** Omaan avaruuspeliin for screen 7, , 0, 1
DIM StarX(200) AS INTEGER
DIM StarY(200) AS INTEGER
DIM StarS(200) AS INTEGER
DIM RStarX(200) AS INTEGER
DIM RStarY(200) AS INTEGER
SCREEN 7, , 0, 1
Tahtia = 60
Kerroksia = 5
CLS
FOR Arvo = 1 TO 200
StarX(Arvo) = INT(RND * 320)
StarY(Arvo) = INT(RND * 200)
StarS(Arvo) = INT(RND * Kerroksia) + 2
NEXT Arvo
Kulma = 0
DO
CLS
Suunta$ = INKEY$
IF Suunta$ = CHR$(0) + "K" THEN Kulma = Kulma + 10
IF Suunta$ = CHR$(0) + "M" THEN Kulma = Kulma - 10
IF Kulma > 360 THEN Kulma = 1
IF Kulma < 1 then Kulma = 360
FOR Suorita = 1 TO Tahtia
RStarX(Suorita) = StarX(Suorita)
RStarY(Suorita) = StarY(Suorita)
IF StarX(Suorita) < 0 THEN StarX(Suorita) = 320
IF StarX(Suorita) > 320 THEN StarX(Suorita) = 0
IF StarY(Suorita) < 0 THEN StarX(Suorita) = 200
IF StarY(Suorita) > 200 THEN StarX(Suorita) = 0
StarX(Suorita) = StarX(Suorita) - SIN(Kulma * 2 * 3.141593 / 360) * StarS(Suorita)
StarY(Suorita) = StarY(Suorita) - COS(Kulma * 2 * 3.141593 / 360) * StarS(Suorita)
PSET (StarX(Suorita), StarY(Suorita)), 15
NEXT Suorita
PCOPY 0, 1
WAIT &H3DA,8
LOOPKommentteja kiitos.
Tähdet liikkuvat hyvin liukkaasti (siis liian lujaa).
EDIT: avaruuspelissä
Liian nopeasti? Onko koneessasi WAIT &H3DA, 8 -vika? Yhden kaverini koneella se ei ainakaan toiminut. No kokeile ensin laittaa vaikka näin:
FOR W = 1 TO 1000 WAIT &H3DA, 8 NEXT W
Jos on vieläkin liian nopea, kasvata lukua 1000. Jos ei toimi, laita näin:
FOR W = 1 TO 100000: NEXT W
Muuttele tuota lukua 100000, kunnes nopeus on sopiva. Ja suorituksenhan voi lopettaa vikojen varalta kesken kaiken painamalla CTRL + PAUSE
EDIT:
tai sitten:
DO: LOOP UNTIL timerwait > TIMER + timerwaitspeed or timerwait < TIMER timerwait=TIMER
ja ohjelman alkuun pistät timerwaitspeediin vaikkapa 0.2
Mutta hieno on silti.
Mukava kuulla. :)
> Juhko
Ei pitäisi olla WAIT &H3DA, 8 -vikaa. :)
Se on vain, kun testasin 2.4 GHz-Celeronilla.
Vaikuttaa hyvältä mutta voisitko laittaa valmiiksi käännetyn version? itse en saanut kääntymään
1 SCREEN 9
x = 0: y = 0: rad = 0
sade = 130: pi = 3.1415: koko = 0
DO
rad = rad + pi / 60
a$ = INKEY$
x = 320 + sade * COS(rad): y = 200 + sade * SIN(rad)
x2 = 320 + sade / 2 * SIN(rad / 1.5): y2 = 180 + sade / 2 * COS(rad / 1.2)
koko = 8 + 7 * SIN(rad)
FOR t = 1 TO 1500: NEXT
CIRCLE (x1, y1), koko1, 0
CIRCLE (x, y), koko, 3
CIRCLE (x3, y3), koko1, 0
CIRCLE (x2, y2), koko, 9
CIRCLE (x1, y3), koko1, 0
CIRCLE (x, y2), koko, 4
x1 = x: y1 = y: koko1 = koko: x3 = x2: y3 = y2
CIRCLE (320, 180), 20, 14
LOOP UNTIL a$ = "e"
1 SCREEN 9
x = 0: y = 0: rad = 0
sade = 130: pi = 3.1415: koko = 0
DO
rad = rad + pi / 60
a$ = INKEY$
x = 320 + sade * COS(rad): y = 200 + sade * SIN(rad)
x2 = 320 + sade / 2 * SIN(rad / 1.5): y2 = 180 + sade / 2 * COS(rad / 1.2)
koko = 8 + 7 * SIN(rad)
FOR t = 1 TO 1500: NEXT
CIRCLE (x1, y1), koko1, 0
CIRCLE (x, y), koko, 3
CIRCLE (x3, y3), koko1, 0
CIRCLE (x2, y2), koko, 9
CIRCLE (x1, y3), koko1, 0
CIRCLE (x, y2), koko, 4
x1 = x: y1 = y: koko1 = koko: x3 = x2: y3 = y2
CIRCLE (320, 180), 20, 14
LOOP UNTIL a$ = "e"
SCREEN 9
x = 0: y = 0: rad = 0
sade = 130: pi = 3.1415: koko = 0
DO
rad = rad + pi / 60
a$ = INKEY$
x = 320 + sade * COS(rad): y = 200 + sade * SIN(rad)
x2 = 320 + sade / 2 * SIN(rad / 1.5): y2 = 180 + sade / 2 * COS(rad / 1.2)
koko = 8 + 7 * SIN(rad)
FOR t = 1 TO 1500: NEXT
CIRCLE (x1, y1), koko1, 0
CIRCLE (x, y), koko, 3
CIRCLE (x3, y3), koko1, 0
CIRCLE (x2, y2), koko, 9
CIRCLE (x1, y3), koko1, 0
CIRCLE (x, y2), koko, 4
x1 = x: y1 = y: koko1 = koko: x3 = x2: y3 = y2
CIRCLE (320, 180), 20, 14
LOOP UNTIL a$ = "e"