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 LOOP
Kommentteja 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"