Kirjautuminen

Haku

Tehtävät

Koodit: QB: 3D-avaruus

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

Kommentit

Juhko [12.10.2006 14:04:36]

#

Kommentteja kiitos.

moptim [15.10.2006 08:25:03]

#

Tähdet liikkuvat hyvin liukkaasti (siis liian lujaa).
EDIT: avaruuspelissä

Juhko [15.10.2006 13:01:33]

#

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

moptim [15.10.2006 13:37:14]

#

Mutta hieno on silti.

Juhko [23.10.2006 14:51:53]

#

Mukava kuulla. :)

moptim [10.02.2007 18:40:15]

#

> Juhko

Ei pitäisi olla WAIT &H3DA, 8 -vikaa. :)

Se on vain, kun testasin 2.4 GHz-Celeronilla.

Dain [28.07.2007 14:40:22]

#

Vaikuttaa hyvältä mutta voisitko laittaa valmiiksi käännetyn version? itse en saanut kääntymään

Nettimato [16.03.2010 08:37:12]

#

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"

Nettimato [16.03.2010 08:38:20]

#

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"

Nettimato [16.03.2010 08:38:43]

#

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"

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta